2016-12-27 3 views
2

Я пытаюсь найти обходное решение для ограничения символов Windows, которое не позволяет копировать файл, если его имя составляет> 260 символов. Согласно this MSDN article, если \\?\ добавлено к имени файла, это будет ограничивать ограничение длины имени файла.Превращение «\? » Не работает для обработки длинных путей

Я попробовал этот тест:

string source = "\\\\?\\C:\\Users\\xxxx\\Documents\\Visual Studio 2013\\Projects\\PDFConverterTester\\PDFConverterTester_BatchGUI\\bin\\Debug\\folder1\\a.txt"; 
string dest= "\\\\?\\C:\\Users\\xxxx\\Documents\\Visual Studio 2013\\Projects\\PDFConverterTester\\PDFConverterTester_BatchGUI\\bin\\Debug\\folder2\\a.txt";    
System.IO.File.Copy(source, dest); 

Но это бросило исключение:

Illegal characters in path. 

Должен ли я претендую этот префикс по-другому?

Редактировать: ИТ-политика моей компании не позволяет мне устанавливать какое-либо новое программное обеспечение без длительного процесса просмотра, то есть я не могу обновить до 4.6.2. поэтому я пытаюсь выяснить, как решить эту проблему с помощью вызовов Windows API из моей существующей установки Visual Studio .NET 4.5.

+0

Вы работаете в .NET Framework 4.6.2? – yaakov

+0

@codran, no, 4.5 – sigil

ответ

1

Чтобы включить поддержку длинного пути, вам нужно либо настроить .NET Framework 4.6.2 (или новее), либо сообщить своему приложению, что он может поддерживать длинные имена файлов. Чтобы сделать это, добавьте это к вашему app.config:

<runtime> 
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" /> 
</runtime> 

Дальнейшее чтение может быть сделано here.

+0

Согласно блогу Джереми Кухне (https://blogs.msdn.microsoft.com/jeremykuhne/2016/06/21/more-on-new-net-path-handling/) on вам тоже нужно, не то и другое. Если вы настроили таргетинг на .NET Framework 4.6.2, то эти коммутаторы уже имеют значение false. Вам нужно только явно установить для них значение false, если они неявно установлены в true, поскольку вы нацелились на более старую версию .NET Framework. И это также означает, что [источник ссылки] (https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/AppContext/AppContextDefaultValues.Defaults.cs) указывает: см. 'If (version <= 40601) 'блок. – hvd

+0

@hvd Смешно, я просто пропустил это сейчас и решил, нужно ли обновлять этот ответ. – DavidG

+1

Обратите внимание, что сообщение в блоге, на которое вы ссылаетесь в своем ответе, - это прозрачная обработка длинных путей к файлу, то есть * без * приложения, которое должно быть добавлено '' '\\? \' ''. Это, вероятно, лучше, но требует поддержки ОС (обновленная версия Windows 10 с нестандартными настройками). Тот, с которым я связан, не отвергает пути '' \\? \ '' ', Требующие обходных путей приложений для длинных путей, но заставляя их работать в гораздо большем количестве систем. – hvd

Смежные вопросы