1

我有一个需要在 *nix 和 windows 下运行的程序。因为程序从文件中获取文件路径,所以问题是如何处理\vs/问题。

我目前的想法是放入一个正则表达式,根据我使用的系统将错误的转换为正确的。这将具有让任一类型在任一系统上工作的效果。除了现在我有两个问题之外,还有人看到其他问题吗?

(非常欢迎其他更好的解决方案)

编辑:主要问题是让 Windows 路径在 unix 上工作,而不是相反。

4

7 回答 7

5

/ 在 win32 中也完全支持。

另请参阅此相关问题

于 2008-11-10T23:04:14.407 回答
1

Windows 通常会接受 \ 或 /,因此只要您完全控制文件名,对 / 进行标准化可能会使您的问题更简单。

于 2008-11-10T23:04:56.900 回答
1

您是否考虑过创建一个“文件管理器”类来为您处理所有文件路径问题?这样,在您的邮件应用程序中,当您加载数据文件时,您可以调用类似这样的内容。

LoadApplicationData(FileManager.GetDataFilePath)

然后您的文件管理器将检测它所在的环境并返回正确的文件路径选项。这样,您也可以适应 Win32 与 Unix 位置标准(如 Program Files 与 /usr 或其他)。

于 2008-11-10T23:06:37.583 回答
1

请注意,当您考虑驱动器号(在 Unix 上没有模拟)和特殊的“分叉”(MacOS pre-X 术语 - 通常在 Unix 上也没有模拟,尽管 MacOS X 有它们 - 惊喜,惊喜)时,Win32 路径是复杂的提供。当心。

于 2008-11-10T23:45:04.743 回答
0

为您的输入创建一个解析器,以创建表示目录的节点的树结构。然后,您可以通过遍历树并编写您想要的任何分隔符或可选地执行不同的操作来“保存”,例如检查目录是否存在或编写元文件。这实际上是我现在认为对我自己的应用程序有用的东西:-)

于 2008-11-10T23:58:54.310 回答
0

你没有说你使用的是什么语言,所以我会自私地假设 c/c++。 boost,如果你愿意使用它,有一个文件系统库。当然,如果您使用的是动态语言,FS 抽象库可能也已经存在(例如在 perl 中,File::Spec 是相当标准的)。

于 2008-11-11T00:23:24.667 回答
0

您还没有告诉我们您正在从中读取路径的文件类型。我将假设它们是配置文件。在这种情况下,有很多方法,恕我直言,正确的答案是设计您的程序以避免操纵路径,如果可能的话。我在这里发布了一个答案:https ://stackoverflow.com/a/40980510/2345997这是相关的。

方法:

  1. 添加一个命令行选项,允许用户指定有问题的路径,而不是从配置文件中读取它。
  2. 添加命令行选项,以便用户可以指定基本路径。配置文件中的路径将被解释为位于此基本路径下。
  3. 将您的配置文件分成三个。一个文件将具有跨平台配置,另一个文件将具有仅 Windows 配置,最终文件将具有仅 Linux 配置。然后用户可以为 Windows 和 Linux 指定正确的路径。在 Windows 上,您的程序将读取跨平台配置文件和仅限 Windows 的配置文件。在 Linux 上,它将读取跨平台文件和仅限 Linux 的配​​置文件。
  4. 将预处理添加到您的配置文件解析中。这将允许您拥有一个配置文件,用户可以在其中使您的程序忽略文件中的某些行,具体取决于程序在哪个操作系统上运行。因此,用户将能够两次指定文件的路径。一次用于 Linux,一次用于 Windows。
  5. 更改设计,使文件始终与可执行文件位于同一目录中 - 然后用户仅在配置文件中指定文件名而不是文件路径。
  6. 使用将“/”切换为“\”的简单函数。然后向用户记录他们必须将路径指定为 Linux 路径,并且此转换将应用于 Windows。
  7. 为此创建您自己的路径迷你语言并将其记录给用户。例如:“/” - 指定目录分隔符,{root} - 展开到文件系统的根目录,{cwd} - 展开到当前目录,{app} - 展开到您的应用程序的路径等...然后用户可以在两个平台上指定文件路径,例如:{root}/myfiles/bob.txt。
  8. 一些路径将在两个平台上都有效。例如:相对路径,如 ../my files/bill.txt。限制您的应用程序仅使用这些路径。记录此限制以及您的应用程序如何处理用户的路径。
于 2016-12-06T17:37:19.260 回答