【问题标题】:file path portability文件路径可移植性
【发布时间】:2008-11-10 23:03:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 注意:/ 在字符串中更容易使用,因为它不是转义字符(如 \),因此标准化 / 也是有好处的。

标签: windows unix portability filepath


【解决方案1】:

win32 也完全支持 /。

另见related question

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      LoadApplicationData(FileManager.GetDataFilePath)
      

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

      【讨论】:

      • 这和我打算做的差不多。
      • 查看您的编辑,通过创建文件管理器类,您不必担心让您的 windows 路径在 UNIX 上工作,您可以将每个路径分开,您只需要如果没有使用安装程序,则指示用户安装到正确的目录。
      • 这是怎么回事?在一个文件中,我有文本“./Foo/Bar.txt”,我需要打开该文件。不管我怎么做,在 Unix 上我需要将 / 转换为 \。我错过了什么吗?
      • 在伪代码中,您的文件管理器会执行如下操作: If Environment.IsWindows Then Return Environment.WinUserDirectory + "/" + AppName + "/Bar.txt" Else Return "/usr/" + 用户名 + "/AppName/Bar.txt" End If
      • 这对我没有任何好处,因为它忽略了当前目录是什么。我需要处理的路径是相对路径。您解决的问题似乎与我正在寻找的不同。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • .NET,但前提是它非常微不足道。否则我需要自己写。
          【解决方案7】:

          您还没有告诉我们您从哪种文件中读取路径。我将假设它们是配置文件。在这种情况下,有很多方法,恕我直言,正确的答案是设计您的程序以避免操纵路径,如果可能的话。我在这里发布了一个答案: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。限制您的应用程序仅使用这些路径。记录此限制以及您的应用程序如何处理用户路径。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-25
            • 1970-01-01
            • 1970-01-01
            • 2013-05-16
            • 1970-01-01
            相关资源
            最近更新 更多