Страницы

Поиск по вопросам

понедельник, 19 ноября 2018 г.

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

Сначала программа валилась на получении списка фалов через 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


Ответ

Для использования длинных сетевых путей к ним добавляется префикс \\?\UNC\. См. Naming Files, Paths, and Namespaces
А почему майки могли побоятся заложить эту логику внутрь, что бы внутри все функции сами при необходимости выполняли дополнение?
Главным образом, из-за обратной совместимости. Вероятно, какие-то программы могут повести себя странно, если просто так отменить это ограничение. На самом деле, в Windows 10 есть возможность использовать длинные пути без префикса, но для этого нужно задать несколько настроек, как на уровне ОС так и в манифесте приложения: .NET 4.6.2 and long paths on Windows 10.

Комментариев нет:

Отправить комментарий