Ограничение максимальной длины пути в Windows 10

Меня, как и некоторых до меня, смущает ограничение максимальной длины пути. Я успешно перенес дерево файлов на NAS с помощью robocopy и нового компьютера с Windows 10.
На исходном компьютере все файлы были ограничены 260 символами. Они были скопированы робокопией в путь \nas-3tb-backup\Public\Save_2019 из пути e:. Я хотел потом проверить это с помощью небольшой программы на С#, но мне это не удалось. Ни FileInfo, ни File.OpenRead не могут найти файл с расширенным путем по имени NAS. Все программы, такие как Блокнот, Visual Studio Code, Проводник Windows, не имеют проблем с отображением или открытием этого файла. Я попытался использовать префикс \\?\, который показан здесь: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#maxpath Но попытка с \ \?\\\nas-3tb-backup---- не удалось. В связанной статье все еще есть подсказка по расширению пути при изменении реестра. Я хочу избежать этого, потому что тогда мне пришлось бы менять все компьютеры с Windows, а поскольку собственные программы Windows работают без взлома реестра, это должно быть для меня возможно.

string fn1 = @"\\?\\\nas-3tb-backup\Public\VeryLongPathToFile";
bool b1 = new FileInfo(fn1).Exists;
if (b1) {
    using (FileStream stream = File.OpenRead(fn1)) {
    var b = stream.ReadByte();
    }
}

person dm76752    schedule 18.12.2019    source источник


Ответы (2)


Изменили ли вы файл app.config в своем решении C#, как описано здесь .NET 4.6.2 и длинные пути в Windows 10.

В этом посте он создал папку по очень длинному пути, но, возможно, это поможет и вам.

Код, который он использовал:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime>
person wes    schedule 18.12.2019
comment
Спасибо за толчок в правильном направлении. Статья хоть и устарела, но указала мне путь. Вы должны создать файл app.manifest с правильным содержимым. - person dm76752; 20.12.2019

Решение

Создать файл манифеста

Файл app.manifest должен содержать

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
  </windowsSettings>
</application>

Никаких изменений в файле конфигурации или политике компьютера не требуется (возможно, для приложений Win32, но не проверено)

Префикс \\?\ не работает для путей UNC. Локальные пути, такие как c:\, должны быть записаны как локальный путь UNC, например. \\?\С:\

Тестовая система

Windows 10 Вер. 1909 .Net Framework 4.7 С# .Net Консольное приложение 64-разрядное

person dm76752    schedule 20.12.2019