2010-02-01 3 views
8

Я использую System.IO.Directory.Delete и пытаюсь удалить системные папки, такие как «Моя музыка», «Мои видео» и т. Д., Но я получаю ошибки, похожие на «Доступ к системному пути» C: \ users \ jbloggs \ Saved Games 'denied ". Однако я могу удалить эти папки через Explorer без каких-либо проблем, у меня есть полные разрешения для этих папок. Любые предложения о том, что я могу попробовать?«Доступ к системному пути запрещен» при использовании «System.IO.Directory.Delete»

Мой код:

public static void ClearAttributes(string currentDir) 
{ 
    if (Directory.Exists(currentDir)) 
    { 
     string[] subDirs = Directory.GetDirectories(currentDir); 
     foreach (string dir in subDirs) 
      ClearAttributes(dir); 
     string[] files = files = Directory.GetFiles(currentDir); 
     foreach (string file in files) 
      File.SetAttributes(file, FileAttributes.Normal); 
    } 
} 

Использование:

try 
{ 
    ClearAttributes(FolderPath); 
    System.IO.Directory.Delete("C:\\users\\jbloggs\\Saved Games", true); 
} 
catch (IOException ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+1

Соответствующие совпадения google не соответствуют точной строке «Доступ к системному пути». Является ли это точной формулировкой сообщения об ошибке? –

+0

Попробуйте указать строку пути. Используйте @ "C: \ users \ jbloggs \ Saved Games". Кроме того, show 'ex.ToString()'. Наконец, это связано с .NET, а не с языком программирования C#. –

+0

Атрибуты не всегда являются проблемой. Другая причина заключается в том, что какое-то приложение имеет этот каталог или что-то под ним открыто. В моем случае приложение было Windows Explorer! У него был заблокирован соответствующий каталог, хотя «текущая» папка была за пределами той, которую я пытался переименовать. Мое приложение не могло переименовать каталог, пока я не закрыл Explorer. –

ответ

14

Да, что папка имеет "только для чтения" установлен атрибут. Это будет работать:

var dir = new DirectoryInfo(@"c:\temp\test"); 
dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly; 
dir.Delete(); 

При удалении материала вы всегда должны учитывать атрибуты файла. Не забудьте остаться в стороне от всего, что есть System или ReparsePoint. И осторожно с ReadOnly и Hidden.

+0

Удивительный, много спасибо nobugz! –

+0

это не сработало для меня в VB.NET :( –

+0

Это будет работать практически каждый раз, тогда как удаление RO не всегда работает: http://stackoverflow.com/a/648055/3543437 –