С# - самый простой способ проанализировать имя файла с пробелами, например. C:\Test\Файл с пробелами.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";

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


person Dominic Bou-Samra    schedule 07.12.2009    source источник
comment
Каким образом использовать? Что сейчас с пробелами?   -  person Adam Robinson    schedule 07.12.2009
comment
В какую программу вы загружаете файл фильма?   -  person Woot4Moo    schedule 07.12.2009
comment
Обновленный вопрос - извините, ребята   -  person Dominic Bou-Samra    schedule 07.12.2009


Ответы (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

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

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

person Michael Petrotta    schedule 07.12.2009
comment
Обтекание окончательного списка аргументов с помощью \ + path + \ сработало. Нубский вопрос, я знаю :P - person Dominic Bou-Samra; 07.12.2009

System.IO.Path предоставляет несколько методов для управления имена файлов...

person Nescio    schedule 07.12.2009
comment
В частности: msdn.microsoft.com/en-us /библиотека/ - person Juliet; 07.12.2009

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

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

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

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

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

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

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

person AceMark    schedule 07.12.2009

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

Поэтому в коде С# у меня есть это:

[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 из своего метода.

person user246013    schedule 07.01.2010

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

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

person Jeff Hornby    schedule 07.12.2009