Страницы

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

понедельник, 23 декабря 2019 г.

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

#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.

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

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