C# - Самый легкий способ проанализировать имя файла с пробелами, например, “C:\Test\File with spaces.txt”

Мне нравится TT ProFont> tweaked< Это чисто и существует четкое различие между 1, l, и я и 0 и O.It работаю лучше всего на уровне 9 ПБ. Это не увеличивается очень хорошо.

ProFont Windows 9pt

8
задан Dominic Bou-Samra 6 December 2009 в 15:49
поделиться

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 "

33
ответ дан 3 November 2019 в 12:13
поделиться

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

7
ответ дан 3 November 2019 в 12:13
поделиться

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

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

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

5
ответ дан 3 November 2019 в 12:13
поделиться

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

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

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

Process p = new Process();
p.StartInfo.FileName = "notepad.exe";
p.StartInfo.Arguments = string.Format("\"{0}\"", filePath);
p.Start();
]
4
ответ дан 3 November 2019 в 12:13
поделиться

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

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

-2
ответ дан 3 November 2019 в 12:13
поделиться

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

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

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

4
ответ дан 3 November 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: