Я пытаюсь удалить папку, и удаление перестало работать из-за папки, содержащей длинные тракты. Я предполагаю, что должен использовать что-то еще вместо 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
В 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
Ограничение в 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;
Проверьте 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);
}
Вы можете попробовать использовать p / invoke для получения "короткого" имени пути с помощью функции GetShortPathName из kernel32.dll:
http: // www .pinvoke.net / default.aspx / kernel32.GetShortPathName