C# – 用空格解析文件名的最简单方法,例如。 “C:\ Test \ File with spaces.txt”

我试图将完整的文件路径传递给FFMPEG。

C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi 

并且它显然不喜欢路径中有空格的事实,错误如下:

 C:\TestFolder\Input\Friends: no such file or directory 

那么使用带空格的文件名最简单的方法是什么? 我应该用〜字符替换所有空格还是有更好的方法? 我试过用各种字符转义字符串:

 @"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi"; 

但这不起作用。 有保留空间的技巧吗?

您通常需要对具有空格的文件名进行任何特殊处理的唯一时间是将它们传递给外部工具或格式。 例如,如果您正在构建外部可执行文件的参数列表,那么您只需引用路径:

 string path = @"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi"; ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "program.exe"; psi.Arguments = "\"" + path + "\""; // escape the quotes 

…这将导致此命令行:

program.exe“C:\ TestFolder \ Input \ Friends – 第6季 – Gag Reel.avi”

System.IO。 Path提供了几种操作文件名的方法……

你在使用FileInfo类吗?

它包含(几乎)有关文件的所有内容,包括属性和文件版本,您不必担心空格或其他不需要的字符。 只要该文件存在,它在FileInfo上运行良好。

用它作为
FileInfo f = new FileInfo(fullPathEvenWithSpaces);

通常,在命令行上作为参数传递的文件路径要求路径用引号括起来。

如果您正在谈论接受文件路径作为程序的参数,那么最简单的方法是要求用户引用路径。 这样,main方法的args参数将整个路径包含为单个字符串。

如果您正在调用其他程序并传递参数,则必须引用带空格的文件路径。

 Process p = new Process(); p.StartInfo.FileName = "notepad.exe"; p.StartInfo.Arguments = string.Format("\"{0}\"", filePath); p.Start(); 

我同意上述post。 为了更容易,这是您需要使用的代码。 在My Humble Opinion中,唯一的好文件名是无空格文件名。

因此在c#代码中我有这个:

 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern uint GetShortPathName( [MarshalAs(UnmanagedType.LPTStr)] string lpszLongPath, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszShortPath, uint cchBuffer); public static StringBuilder shortNameBuffer = new StringBuilder(256); public static string ToShortPathName(string longName) { uint result = GetShortPathName(longName, shortNameBuffer, 256); return shortNameBuffer.ToString(); } 

这为您的类添加了一个可以像这样使用的方法:

String goodFileName = ToShortPathName(evilFileName);

注意:我在UI中使用它,所以我不介意非线程安全并重用StringBuider。 如果您处于multithreading环境中,请确保在方法中提取StringBuilder。

所有文件都有一个与DOS 8.3兼容的短路径名。 获取该文件名的唯一方法是GetShortPathName。 我能找到的最好的解释是在以下地址:

http://www.pinvoke.net/default.aspx/kernel32.GetShortPathName