Помощь C # необходимо изменить код, который удаляет папки с длинными путями - PullRequest
1 голос
/ 03 марта 2010

Некоторое время назад я задал вопрос по stackoverflow об удалении папок с длинными путями (> 260 символов), наиболее популярным решением было перемещение в каждый каталог, чтобы уменьшить длину пути. Я боролся с этим, и я не буду дальше, кто-то может предложить, пожалуйста, как я включил бы предложенный код в мой код?

Типичный путь:

\\ имя_сервера \ share \ dave \ Private \ Careers \ Ed \ Careers Ed \ Fun Careers Education \ Chris's не используется с 2006 по 07 \ old 4. Неделя активности в области карьерного роста 1 30.10.06 или 6.11.06 или 13.11.06 Знакомство с уровнями занятости и карьерными ресурсами \ Сферы деятельности и уровни занятости Справочный лист репетитора [1] .doc

Большое спасибо

// Предлагаемый код:

var curDir = Directory.GetCurrentDirectory();
Environment.CurrentDirectory = @"C:\Part\Of\The\Really\Long\Path";
Directory.Delete("Relative\Path\To\Directory");
Environment.CurrentDirectory = curDir;

// Мой код:

try
 {
     var dir = new DirectoryInfo(@FolderPath);
     dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly;
     dir.Delete();
 }
 catch (IOException ex)
 {
     MessageBox.Show(ex.Message,"Delete Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
 }

Ответы [ 3 ]

1 голос
/ 03 марта 2010

Вы пытались использовать синтаксис длинного пути? Из функции CreateFile в SDK платформы:

Максимальная длина пути в Windows API (с некоторыми исключениями обсуждались позже) максимальная длина пути MAX_PATH, который определен как 260 персонажи. Локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты разделены обратной косой чертой и завершающим нулем персонаж. Например, максимум путь на диске D "D: \ <256 chars> NUL ".

Windows API имеет много функций которые также имеют версии Unicode для разрешить максимальную длину пути приблизительно 32 000 символов состоит из компонентов до 255 символы каждый в длину. Указать такой путь расширенной длины, используйте префикс "\? \". Например, "\ \ D: \".

Примечание. Максимальный путь 32 000 символы приблизительны, потому что Префикс "\? \" может быть расширен до длинная строка и расширение относится к общей длине.

Чтобы указать такой путь с помощью UNC, используйте префикс "\? \ UNC \". Например, "\? \ UNC \\". Эти префиксы не используются как часть сам путь. Они указывают на то, что путь должен быть передан в систему с минимальной модификацией, что означает что вы не можете использовать косые черты в представляют разделители пути или точку представлять текущий каталог. Кроме того, вы не можете использовать префикс "\? \" с относительным путем. Относительные пути ограничены символами MAX_PATH.

Последний абзац, конечно, относится к вашему делу.

Не уверен, что .NET поддерживает этот тип пути. Вы можете использовать P / Invoke для вызова RemoveDirectory из Win32 SDK.

1 голос
/ 16 августа 2011

Используйте ZetaLongPaths. Он обрабатывает длинные пути. Google ZetaLongPaths

1 голос
/ 03 марта 2010

Перед «удалением каталога» мы должны быть уверены, что он пуст. Вы могли бы рассмотреть возможность использования обратного подхода к просмотру каталогов.

Это повлечет за собой работу с каждым каталогом отдельно в глубоком порядке.

Некоторый псевдокод;

While (fullPath.Length > 0)
{
    DirectoryToDelete = GetLastPartOfPath( fullPath );
    CurrentDirectory = fullPath - DirectoryToDelete;

    ChangeDirectory(CurrentDirectory);
    DeleteDirectory(DirectoryToDelete);

    fullPath = fullPath - DirectoryToDelete;
}

Надеюсь, это поможет,

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