【问题标题】:Cross-platform file name handling in .NET Core.NET Core 中的跨平台文件名处理
【发布时间】:2016-11-05 05:20:02
【问题描述】:

如何跨平台处理System.IO类中的文件名,使其在Windows和Linux上运行?

例如,我编写的这段代码可以在 Windows 上完美运行,但它不会在 Ubuntu Linux 上创建文件:

var tempFilename = $@"..\Data\uploads\{filename}";
using (FileStream fs = System.IO.File.Create(tempFilename))
{
    file.CopyTo(fs);
    fs.Flush();                    
}

【问题讨论】:

    标签: c# linux .net-core


    【解决方案1】:

    您也可以使用 Path.DirectorySeparatorChar 如下:

     Console.WriteLine("..{0}Data{0}uploads{0}{{filename}}", Path.DirectorySeparatorChar);
    

    参考:MSDN

    【讨论】:

      【解决方案2】:

      Windows 使用反斜杠。 Linux 使用斜线。 Path.Combine 设置正确的符号:
      Path.Combine Method - MSDN

      【讨论】:

      • 有没有一种类似于Qt的自动路径转换,专门使用斜杠,并在windows上将它们转换为反斜杠?
      • @Rem 你需要转换它们吗? Windows 通常也支持斜线。
      • 正如 svick 所说,斜杠可以用作 Windows 上的路径分隔符(只有 command.com 和 cmd.exe 将斜杠解释为其他内容)@Rem
      • 可能正在检测字节序,或者其他)))如果我需要在 C# 中处理这样的事情,我会用 C++ 编写!
      • 值得注意的是,如果在 Linux 上组合两条路径,此方法不会“纠正”任一路径中的任何现有反斜杠。它假定给定的参数对于操作系统是正确的,并且只是根据操作系统的需要插入正确的目录分隔符。
      【解决方案3】:

      很多很好的答案。 我只想补充一点,可以避免使用 Path.Combine 指定目录分隔符

      以文件相对位于“.\..\toto\app.config”为例:

      Path.Combine("..", "toto", "app.config");
      

      不幸的是,Path.Combine 无法将相对路径解析为 .Net Core 中的绝对路径。 Path.GetFullPath 就是为了这个:

      Path.GetFullPath(Path.Combine("..", "toto", "app.config"))
      

      【讨论】:

      • 我不确定 Path.GetFullPath 是否可以在 Windows 上运行,但它可以在 macos 上运行。我会更新我的答案
      【解决方案4】:

      您可以简单地使用斜线。相对路径的工作方式相同,绝对路径只能相对于主驱动器的根目录(因为以“c:”开头的绝对路径不可移植)

      【讨论】:

        【解决方案5】:

        原来的帖子已经有一年多了,但我还是遇到了这个问题。 在我看来,在相对路径中使用点也是一个问题。

        类似的路径

        ".\\input\\mydata.csv" 
        

        在 windows 上运行良好,但在 unix 上运行良好。 将当前目录的点表示法更改为:

        Path.GetFullPath(Directory.GetCurrentDirectory())
        

        我取得了更大的成功。

        【讨论】:

        • 正斜杠在 Windows 和 Unix 平台上都不能正常工作吗?
        【解决方案6】:

        当然,正斜杠可以正常工作 - 除非它们不。这是一个较老的问题,但在这方面,LoadLibrary 确实让我很痛苦。请参阅讨论此问题的https://stackoverflow.com/a/34708551/1318024。尽管我们确实希望 Windows 能够优雅地处理路径分隔符(我们确实希望 *nix!),但最好使用适合平台的路径分隔符。

        【讨论】:

        • 我确实注意到在 ReactOS 中斜杠在用户空间函数中被翻译,也许有些人不做翻译。呵呵。
        【解决方案7】:

        我在 windows 和 linux 上进行开发,因此 json 配置中的相对路径设置并不总是适合平台。如果配置路径中有路径分隔符,Path.Combine 将无济于事。使用替换就可以了。例如:

        var root = "c:\\bob";
        var dir = "somepath/fred";
        var path = Path.Combine(root, dir);  // = c:\bob\somepath/fred
        
        path.Replace('/', Path.DirectorySeparatorChar); // = c:\fred\somepath\fred on windows
        

        【讨论】:

          【解决方案8】:

          linux中文件名大小写也有问题。例如,如果您有像 Index.js 这样的文件名并在您的代码中使用像 index.js 反之亦然,那么您也遇到了问题

          【讨论】:

            猜你喜欢
            • 2010-09-12
            • 1970-01-01
            • 1970-01-01
            • 2021-03-15
            • 1970-01-01
            • 1970-01-01
            • 2021-08-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多