Как создать копию файла длиной более 260 символов - PullRequest
6 голосов
/ 16 января 2009

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

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

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

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

Ответы [ 7 ]

9 голосов
/ 16 января 2009

Вы столкнулись с ограничением 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

Пример кода P / Invoking для этих методов с использованием 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 связывает , выглядит так, как будто она избавит вас от проблемы P / Invoking в kernel32.dll, не будучи уверенным, хотите ли вы получить зависимость от внешней библиотеки DLL. *

2 голосов
/ 13 марта 2012

Здесь вы найдете полную библиотеку , которая поддерживает длинные имена файлов.

2 голосов
/ 16 января 2009

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

1 голос
/ 27 января 2009

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

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

0 голосов
/ 29 июня 2017

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

Они переходят на .Net 4.5.2 (29/6/2017). Я использовал очень короткую программу #C для использования в качестве надстройки COM в Excel. См. эту ссылку для создания программы и эту ссылку для программы копирования . Вам нужно только назначить Программу для .NET 4.5, добавить ссылку на AlphaFS.dll для 4.5 и заменить using System.IO на using Alphaleonis.Win32.Filesystem;.

0 голосов
/ 16 января 2009
0 голосов
/ 16 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...