2009-01-16 1 views
6

Как создать копию длины файла, имеющие более чем 260 символов, включая имя файла с помощью vb.netКак создать копию файла, имеющую длину более 260 символов

Когда мы пытаемся создать копию используя метод File.Copy, он выдает исключение следующим образом:

«Указанный путь, имя файла или и то, и другое слишком длинное. Полное имя файла должно быть менее 260 символов, а имя каталога должно быть меньше 248 персонажи."

ли это возможно, то пожалуйста, помогите ...

ответ

2

Есть советы для сокращения названия ... смотрите раздел под названием «Причина 4: Файлы существуют в путях, которые глубже, чем символы MAX_PATH» в http://support.microsoft.com/?kbid=320081#

+0

Его ограничение на Windows. если FilePath превышает 260 символов, большинство операций с файлами будут вызывать подобные ошибки. Даже у файла переименования будут проблемы. Думаю, – Gishu

+0

Ответ Мэтта (использование 'CopyFile') лучше моего. – ChrisW

9

Вы используете ограничение MAX_PATH. Как работа вокруг, вы должны иметь возможность P/Invoke напрямую обращаться к функции CopyFile ядра kernel32.dll и использовать префикс «\\? \» Перед пути назначения, чтобы предотвратить попадание проблемы MAX_PATH.

Обратите внимание, что, хотя вы можете скопировать файл таким образом, что большинство приложений не смогут его открыть, так как они также ограничены MAX_PATH.

Хороший обзор проблемы можно найти здесь: http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx

Некоторые примеры кода Р/Вызов в эти методы с использованием C# можно найти в части 2, здесь: http://blogs.msdn.com/bclteam/archive/2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton.aspx

библиотеки, schnaader linked выглядит так, что это избавит вас от проблемы P/Invoking в kernel32.dll, не уверен, хотите ли вы зависеть от внешней dll или нет.

0

То, что я обычно делаю в этом случае является:

1) Подсчитать имя файла length

2) Если FileNameLength > 259 затем обрезать имя файла достаточно, чтобы справиться с новым именем, а затем скопировать файл с обрезанное имя назначения.

1

У меня есть решение по этой проблеме.

On R & D Я нашел, что мы можем переименовать указанный каталог путей, хотя общая длина превышает 260 символов, а затем мы можем скопировать файл из указанного местоположения в новое (временное) место для нашей цели сканирования. И, наконец, мы снова можем переименовать путь к файлу с оригинальным.

0

jdelimon уже указал на библиотеку Delimon.Win32.IO, но в последний раз, когда они обновлялись, это был 2012 (.Net 2.0). Вот еще одна библиотека: AlphaFS

Они поднимаются на .Net 4.5.2 (29/6/2017). Я использовал очень короткую программу #C, которая будет использоваться в качестве надстройки COM в Excel. См. this link in how to create a program и this link for the copy-program. Вам нужно только назначить Программу на .NET 4.5, добавить ссылку на AlphaFS.dll для 4.5 и заменить using System.IO на using Alphaleonis.Win32.Filesystem;.

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