Как установить длинную строку (>260) в имени файла по умолчанию в SaveFileDialog?
Я использую SaveFileDialog и должен установить длинную строку (longFileName) в FileName. Строка longFileName известна во время выполнения.
Если я установлю
saveFileDialog.FileName = longFileName ;
тогда я получаю System.IO.PathTooLongException
,
Как мне это сделать?
7 ответов
Короче говоря, вы не можете; NTFS имеет максимальный размер файла 256.
Мой совет будет сократить ваше имя файла.
Хотя вы можете иметь имена файлов длиннее 260 символов, вы можете столкнуться с некоторыми странностями с API. Кроме того, .net не поддерживает это напрямую.
Если вам нужна дополнительная информация, вот ссылка на первое из трех сообщений в блоге команды BCL о проблеме: http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx
Вы можете попробовать версию имени файла с коротким путем, используя:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName(
[MarshalAs(UnmanagedType.LPTStr)] System.String path,
[MarshalAs(UnmanagedType.LPTStr)] System.Text.StringBuilder shortPath,
System.Int32 shortPathLength);
Тогда диалог сохранения файла будет выглядеть примерно так:
string long_path = @"C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\1033\vsdebugui.dll";
StringBuilder s = new StringBuilder(long_path.Length);
int short_path_length = GetShortPathName(long_path, s, long_path.Length);
string short_path = s.ToString();
SaveFileDialog save_d = new SaveFileDialog();
save_d.FileName = short_path;
save_d.ShowDialog();
Ответ заключается в следующем:
В: Какое максимальное количество символов может быть в имени файла?
A: Это зависит от того, создается ли файл в разделе FAT или NTFS. Максимальная длина имени файла в разделе NTFS составляет 256 символов, а в FAT - 11 символов (8 символов имени, 3 символа расширения). Имена файлов NTFS сохраняют свой регистр, в то время как имена файлов FAT не имеют понятия регистра (однако регистр игнорируется при выполнении поиска и т. Д. В NTFS). Существует новый VFAT, который также имеет имена файлов из 256 символов.
По сути, ОС определяет максимальный размер файла, а не ваше приложение. Если в будущем будет выпущена лучшая файловая система, которая будет поддерживать большее количество символов, вы всегда можете сделать свое программное обеспечение совместимым с последующим совместным использованием, разрешив его и сообщив пользователю, когда путь слишком длинный. Тем не менее, с текущим прогрессом технологии вы не можете использовать имя файла длиной более 256 символов.
Добавлять \\?\
к началу пути. Так D:\<very_long_path>
станет \\?\D:\<very_long_path>
, См. Ссылку "Ограничение максимальной длины пути" в http://msdn.microsoft.com/en-us/library/aa365247.aspx
Ты не можешь
Помните, что пути в Windows должны содержать не более 256 символов. (Если вы не используете специальный трюк)
Почему вы хотите такое длинное имя файла в первую очередь?
Как уже упоминали другие, нет хорошего способа обойти это ограничение. Однако проблема не в NTFS, а в Win32. Используя SFU, вы можете сделать несколько смехотворно длинных путей, если вы действительно этого хотите, но это делает взаимодействие с нативным Win32 интересным.
Возможно, вы захотите попытаться предвосхитить путь с помощью \\?\. Я никогда не пробовал это с.NET, хотя.