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