簡體   English   中英

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

[英]C# - Easiest way to parse filename with spaces eg. “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();

我同意上述帖子。 為了更容易,這是您需要使用的代碼。 在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。 如果您處於多線程環境中,請確保在方法中提取StringBuilder。

所有文件都有一個與DOS 8.3兼容的短路徑名。 獲取該文件名的唯一方法是GetShortPathName。 我能找到的最好的解釋是在以下地址:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM