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