C# - Самый простой способ проанализировать имя файла с пробелами, например. "C:TestFile с пробелами.формат txt"

Я пытаюсь передать полный путь к файлу FFMPEG.

C:TestFolderInputFriends - Season 6 - Gag Reel.avi

и это, очевидно, не нравится тот факт, что путь имеет пробелы в нем, ошибаясь так:

C:TestFolderInputFriends: no such file or directory

Итак, каков самый простой способ использовать имена файлов с пробелами в них? Должен ли я просто заменить все пробелы символами ~ или есть лучший способ? Я попытался избежать строки с различными символами:

@"C:TestFolderInputFriends - Season 6 - Gag Reel.avi";

но это не сработает. Есть ли трюк в сохранении пространств?

6 ответов


единственный раз, когда вам обычно придется делать специальную передачу с именами файлов, которые имеют пробелы, - это когда вы передаете их внешним инструментам или форматам. Если вы создаете список аргументов для внешнего исполняемого файла, например, все, что вам нужно сделать, это процитировать путь:

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

...что приведет к этой командной строке:


система.ИО.Путь предоставляет несколько методов для манипулирования файлами...


вы используете FileInfo класса?

Он содержит (почти) все о файле, включая атрибуты и версии файлов, и вам не нужно беспокоиться о пробелах или других нежелательных символах. Пока файл существует, он хорошо работает на FileInfo.

использовать его как
FileInfo f = new FileInfo(fullPathEvenWithSpaces);


В общем случае пути к файлам, переданные в качестве аргументов в командной строке, требуют, чтобы путь был окружен кавычками.

Если вы говорите о принятии путей к файлам в качестве аргумента для вашей программы, проще всего требовать от пользователей цитировать пути. В ту сторону,args аргумент вашего метода main будет содержать весь путь в виде одной строки.

Если вы вызываете другие программы и передаете аргументы, пути к файлам с пробелами должны быть цитируемый.

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

Я согласен с выше постом. Чтобы было проще, вот код, который вам нужно использовать. По моему скромному мнению, единственное хорошее имя файла-это имя файла без пробела.

для этого в коде 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();
}

это добавляет метод к вашему классу, который можно использовать следующим образом:

строка goodFileName = ToShortPathName (evilFileName);

примечание: Я использую это в пользовательском интерфейсе, поэтому я не против быть не потокобезопасным и повторно использовать StringBuider. Если вы находитесь в многопоточной среде, не забудьте вытащить распределение StringBuilder внутри вашего метода.


все файлы имеют короткий путь, совместимый с DOS 8.3. Единственный способ получить это имя файла-GetShortPathName. Лучшее объяснение, которое я могу найти, находится по следующему адресу:

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