C# удаляя папку, которая имеет длинные тракты

Я пытаюсь удалить папку, и удаление перестало работать из-за папки, содержащей длинные тракты. Я предполагаю, что должен использовать что-то еще вместо dir. Удалите (верный), Кто-либо пересек этот мост прежде?

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

 try
{
 var dir = new DirectoryInfo(@FolderPath);
 dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly;
 dir.Delete(true);
}
catch (IOException ex)
{
 MessageBox.Show(ex.Message);
}

Это - рассматриваемый путь: \server\share\dave\Private\Careers\Careers Ed\Fun Карьерный Education\Chris, не используемый 2 006 to07\old 4. Карьерная Неделя Действия области 1 30.10.06 или 6.11.06 или 13.11.06 Введений в уровни задания и карьера resources\Occupational области и Лист Справки Обучающей программы Уровней задания [1] .doc

16
задан Jamie 8 February 2010 в 16:50
поделиться

4 ответа

В Windows API максимальная длина пути равна MAX_PATH, что составляет 260 символов. Локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имени, разделенные обратными косыми чертами, и завершающий нулевой символ. Например, максимальный путь на диске D равен «D: \ some 256-символьная строка пути », где « » представляет собой невидимый завершающий нулевой символ для текущая системная кодовая страница. (Символы <> используются здесь для наглядности и не могут быть частью допустимой строки пути.) [MSDN]

Версии Unicode некоторых функций допускают максимальную длину пути примерно 32 000 символов. компонентов длиной до 255 символов. Чтобы указать такой путь, используйте префикс "\\? \" . Максимальный путь в 32 000 символов является приблизительным, поскольку префикс "\\? \" может быть расширен до более длинной строки, и расширение применяется к общей длине.

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

Оболочка и файловая система могут иметь разные требования. С помощью API можно создать путь, который пользовательский интерфейс оболочки не может обработать.

Синтаксис C #:

[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool DeleteFile(string path);

Для получения дополнительной информации о классе см. Системное пространство имен - MSDN

Выдержки из:

Пути файловой системы: как долго это слишком долго? - Coding Horror

Функция DeleteFile (Windows) - MSDN

11
ответ дан 30 November 2019 в 21:28
поделиться

Ограничение в 260 символов (я предполагаю, что это именно то, с чем вы столкнулись) является проблемой в Windows, а не в .NET, к сожалению, поэтому обойти это может быть сложно.

Вы можете обойти это, изменив свой рабочий каталог так, чтобы относительный путь для удаления был меньше 260 символов; Не знаю, сработает это или нет.

то есть:

var curDir = Directory.GetCurrentDirectory();
Environment.CurrentDirectory = @"C:\Part\Of\The\Really\Long\Path";
Directory.Delete("Relative\Path\To\Directory");
Environment.CurrentDirectory = curDir;
3
ответ дан 30 November 2019 в 21:28
поделиться

Проверьте Win32 API: http://msdn.microsoft.com/en-us/library/aa363915%28VS.85%29. aspx

Там говорится: «В версии этой функции ANSI имя ограничено символами MAX_PATH. Чтобы расширить это ограничение до 32 767 широких символов, вызовите версию функции Unicode и добавьте" \? \ "к дорожка."

Добавьте pinvoke:

using System;  
using System.Runtime.InteropServices;  
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]  
[return: MarshalAs(UnmanagedType.Bool)]  
internal static extern bool DeleteFile(string lpFileName);

Используйте его:

public static void DeleteLong(string fileName) {

    string LongName = @"\\?\" + fileName;
    DeleteFile(formattedName);
}
3
ответ дан 30 November 2019 в 21:28
поделиться

Вы можете попробовать использовать p / invoke для получения "короткого" имени пути с помощью функции GetShortPathName из kernel32.dll:

http: // www .pinvoke.net / default.aspx / kernel32.GetShortPathName

0
ответ дан 30 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: