Как установить длинную строку (>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, хотя.

Другие вопросы по тегам