.NET Core 中的跨平台文件名处理

Cross-platform file name handling in .NET Core

如何跨平台处理 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();                    
}

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

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

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

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

参考:MSDN

原来的 post 已经有一年多了,但我仍然 运行 关注这个问题。 在我看来,在相对路径中使用点也是一个问题。

这样的路径
".\input\mydata.csv" 

在 windows 上运行良好,但在 unix 上运行不佳。 将当前目录的点符号更改为:

Path.GetFullPath(Directory.GetCurrentDirectory())

我取得了更大的成功。

很多好的答案。 我只想补充一点,可以避免使用 Path.Combine

指定目录分隔符

文件相对位于“.\..\toto\app.config”的示例:

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

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

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

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

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

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

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