.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
如何跨平台处理 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