Я согласен с вышеуказанным постом. Чтобы сделать это проще, вот код, который вам нужно использовать. В 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);
ПРИМЕЧАНИЕ: я использую это в пользовательском интерфейсе, так что я не против того, чтобы не поддерживать потоки и повторно использовать StringBuider Если вы находитесь в многопоточной среде, убедитесь, что вы извлекаете распределение StringBuilder внутри вашего метода.