FileStream и пути длинною >260 символов

228
15 марта 2018, 07:23

Сначала программа валилась на получении списка фалов через Directory.GetFiles с PathTooLongException.

Почитал и нашел информацию, о том, что ограничение сняли в последних фреймворках.

Хорошо, сменил версию, но теперь при создании FileStream вылетает System.IO.DirectoryNotFoundException. с таким стеком:

в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) в System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) в System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) в MD5Calculator.Program.Main(String[] args) в E:\Projects!My Projects\MD5Calculator\MD5Calculator\Program.cs:строка 36

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

Получается FileStream не поддерживает длинные пути? Как уйти от этого?

UPD

Минимальный код:

 var filePath = @"\\?\"+Path.Combine(fileList.Key, list[i].FileName);
    using (var stream = new FileStream(filePath, FileMode.Open,FileAccess.Read, FileShare.ReadWrite))
 {
  }

Добавление @"\\?\" поменяло исключение на

System.IO.IOException: 'Синтаксическая ошибка в имени файла, имени папки или метке тома

Может быть с шарой такое не работает?

Вот еще пример пути, который вызывает проблему и я немного обфуцировал звездочками:

\\******\********\*******\*******************\****************\******\**********  *********\image0000015B0000018B0000027B0000041B0000042B0000046B0000099B0000303B0000363B0000380B0000484B0000563B0000569B0000958B0000959B0000972B0001164B0000025B0000050B0000149A.jpg
Answer 1

Для использования длинных сетевых путей к ним добавляется префикс \\?\UNC\. См. Naming Files, Paths, and Namespaces

А почему майки могли побоятся заложить эту логику внутрь, что бы внутри все функции сами при необходимости выполняли дополнение?

Главным образом, из-за обратной совместимости. Вероятно, какие-то программы могут повести себя странно, если просто так отменить это ограничение. На самом деле, в Windows 10 есть возможность использовать длинные пути без префикса, но для этого нужно задать несколько настроек, как на уровне ОС так и в манифесте приложения: .NET 4.6.2 and long paths on Windows 10.

READ ALSO
Записать в базу текст из динамически созданных textbox- ов

Записать в базу текст из динамически созданных textbox- ов

Одной кнопкой я создаю динамические массивы, введя их количество во второй текстбокс

215
Удаленный сервер возвратил ошибку 403

Удаленный сервер возвратил ошибку 403

Вчера работал над проектом, всё было нормальноСегодня при попытке скачать строку со страницы вылетает исключение

239
API Telegram. Как посмотреть время /дату последнего посещения пользователя telegram

API Telegram. Как посмотреть время /дату последнего посещения пользователя telegram

Можно ли посмотреть с помощью Telegram API время когда пользователь telegram был в сети последний раз? А то есть такие у которых включена last seen privacy...

2470
Как обновлять проекты в FirstCode

Как обновлять проекты в FirstCode

При добавлении новых классов-таблиц в DbContext выдает ошибку и приходиться удалять базу и заново запускать проект

245