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

本文关键字:文件名 处理 跨平台 Core net | 更新日期: 2023-09-27 17:54:06

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

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

您也可以使用Path。

目录分隔符
 Console.WriteLine("..{0}Data{0}uploads{0}{{filename}}", Path.DirectorySeparatorChar);

参考:MSDN

Windows使用反斜杠。Linux使用斜杠。路径。组合设置正确的符号:
路径。组合方法- MSDN

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

文件相对位于".'..'toto'app.config"的示例:

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

不幸的是,路径。在。net Core中,Combine不能将相对路径解析为绝对路径。路径。GetFullPath在这里:

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

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

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

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

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

Path.GetFullPath(Directory.GetCurrentDirectory())

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

我在windows和linux上做开发,所以json配置中的相对路径设置并不总是正确的平台。路径。如果在配置路径中有路径分隔符,则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

你可以使用这个简单的函数:

private string get_platform_compatible_path(string path)
{
   return path.Replace('''', Path.DirectorySeparatorChar).Replace('/', Path.DirectorySeparatorChar);
}

在linux中也存在文件名大小写的问题。例如,如果文件名是index。js代码中使用的是index。js反之亦然,也会出现问题