10

我正在尝试将完整的文件路径传递给 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";

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

4

6 回答 6

34

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

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"

于 2009-12-07T01:52:29.737 回答
8

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

于 2009-12-07T01:44:36.113 回答
5

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

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

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

Process p = new Process();
p.StartInfo.FileName = "notepad.exe";
p.StartInfo.Arguments = string.Format("\"{0}\"", filePath);
p.Start();
于 2009-12-07T01:56:33.083 回答
5

你在FileInfo上课吗?

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

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

于 2009-12-07T02:10:42.023 回答
4

我同意上面的帖子。为了使它更容易,这里是您需要使用的代码。在我的拙见中,唯一好的文件名是无空格的文件名。

因此在 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。如果您处于多线程环境中,请确保在您的方法中提取 StringBuilder 分配。

于 2010-01-07T23:43:15.537 回答
-2

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

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

于 2009-12-07T02:25:54.847 回答