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