我有反恐精英:条件零游戏。每当我将它安装在一个文件夹中C:\FolderName
并在安装后启动游戏时,游戏都会以2 个介绍视频开始 (我在游戏安装文件夹中找到了这些视频,都有 .avi 扩展名)。
但是我注意到了一个非常奇怪的行为。如果我在游戏中删除并再次安装游戏,C:\Folder Name
除了这 2 个介绍视频不会在启动时播放外,其他游戏都可以正常工作。很奇怪。
为了确认这是否是确切原因,我尝试使用不同的命名文件夹安装此游戏至少 15 次。很少有文件夹名称带空格,很少没有空格。并且它确认如果文件夹名称有任何空格,这些介绍视频将不会播放。
这些视频文件具有以下路径:C:\My Folder Name\czero\media
或C:\MyFolderName\czero\media
游戏启动hl.exe
文件的路径:C:\My Folder Name
或C:\MyFolderName
游戏在两种情况下都能正确安装,但视频仅在第二种情况下播放,即MyFolderName
.
看起来游戏试图避免使用 .avi 文件,或者某些 Windows 功能会强制游戏不播放这些文件 - 只要文件夹名称中有空格。
我会在游戏 SE 网络上询问它,但我强烈认为这种奇怪的行为只是因为主文件夹名称中的空间并且仅与那些 .avi 文件相关。
有什么特别的原因吗?是因为某些防火墙/防病毒/UAC 保护和规则吗?
听起来像是游戏中的一个错误,其中代码打开不带引号的视频,因此视频路径的一部分被假定为实际上不是的参数,从而导致错误,因此视频永远不会播放。控制台也可能会记录错误。
稍微解释一下……在 Windows 中,当您使用路径时,您可以这样键入它:
或者
注意引号。
当您启动外部程序时,例如视频播放器,视频播放器的参数列表可能如下(这是一个示例)
现在假设您有半条命作为文件夹名称:
没有名为 Half 的视频没有扩展名,也没有将 Life\intro.avi 理解为参数,因为视频播放器无法识别它。
请注意,半条命 1 是一款非常古老的游戏。那是在 8.3 长度的文件名仍然很普遍的时代。
根本问题是在 Windows下被调用者负责解析命令行。被调用者将整个命令行作为一个字符串获取。(相比之下,*nix 系列操作系统将一组单个参数传递给被调用者,对应于
argv
. 分隔参数根本不是问题。)典型的约定用空格分隔命令行参数;因此,必须引用包含空格的单个参数。引号是传递给被调用者的命令行的一部分!有关讨论,请参阅此 Microsoft 文章。作为一个附带问题,不能保证被调用者完全处理报价!不要无端引用参数。在您的情况下,引用路径参数被忘记了:游戏中的一个错误。此外,模块测试中的整个等效组都被遗漏了。
你可能从你最喜欢的 *nix shell 中知道这样的麻烦:如何再次传递包含引号的参数?用户 shell是 *nix 世界中唯一需要解析命令行的程序。相比之下,以编程方式从另一个二进制文件调用一个二进制文件没有这个问题:调用者只需在调用之前填充一组参数,将
exec
单个参数提供给银盘上的被调用者。正是这种考虑不周的传统 DOS 调用约定与考虑不周的嬉皮士想法(这是 Apple 的错!1)在路径名称中的空格的这种考虑不周的组合,会导致像您这样的错误。
1是的,我知道,路径名称中的空格(和其他有趣的字符)在苹果采用之前就已经存在;但是没有理智的 *nix 用户会自愿将文件夹命名为“Program Files”。这样的废话无权存在于最终用户系统上。