. 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();
}
您也可以使用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反之亦然,也会出现问题