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

Rem*_*Rem 24 c# linux .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();                    
}
Run Code Online (Sandbox Code Playgroud)

one*_*fee 34

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

 Console.WriteLine("..{0}Data{0}uploads{0}{{filename}}", Path.DirectorySeparatorChar);
Run Code Online (Sandbox Code Playgroud)

参考:MSDN


小智 32

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

  • 值得注意的是,如果在 Linux 上组合两个路径,此方法不会“更正”任一路径中任何现有的反斜杠。它假定给定的参数对于操作系统来说是正确的,并且只根据操作系统的需要插入正确的目录分隔符。 (3认同)
  • @Rem你需要转换它们吗?Windows通常也支持斜杠. (2认同)
  • 可能正在检测字节序,或者其他)))如果我需要在 C# 中处理这样的事情,我会用 C++ 编写! (2认同)

Vil*_*mir 9

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

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

Path.Combine("..", "toto", "app.config");
Run Code Online (Sandbox Code Playgroud)

不幸的是,Path.Combine 没有将相对路径解析为 .Net Core 中的绝对路径。Path.GetFullPath 在这里:

Path.GetFullPath(Path.Combine("..", "toto", "app.config"))
Run Code Online (Sandbox Code Playgroud)


Pau*_*ian 5

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