2013-03-06 5 views
7

Моя консольная прикладная программа создает некоторые файлы во время работы, так что я хочу удалить все эти файлы при запуске приложения. Я попытался это:File.Delete Доступ к пути запрещен

public static void Empty(string targetDir) 
{ 
    var directory = new DirectoryInfo(targetDir); 
    if (!directory.Exists) return; 
    foreach (var file in directory.GetFiles()) file.Delete(); 
    foreach (var subDirectory in directory.GetDirectories()) subDirectory.Delete(true); 
} 

... просто искать все файлы/папки в заданном пути (который находится в подкаталоге пути выполнения программы), а затем удалить их. Однако я получаю следующее исключение:

Доступ к файлу пути запрещен.

Я попытался запустить программу как администратор, не повезло; Однако я хочу, чтобы решение работало без использования прав администратора.

Примечания:

  1. Файл не работает в другом приложении.
  2. Файл не находится в защищенной папке.
  3. Файл можно удалить вручную без проблем, и именно поэтому i здесь.
+0

Просто сомнитесь: действительно ли вы удаляете все файлы в пути приложения? – rcdmk

+4

Я просто хочу сказать, потому что ваша программа также является файлом. – rcdmk

+0

Ofc Нет, файлы, которые я удаляю, находятся в подкаталоге, расположенном на пути к приложению. –

ответ

1

Попробуйте использовать методы Microsoft.VisualBasic.FileIO.FileSystem, так как он имеет удобный метод DeleteDirectory. У меня были проблемы с доступом некоторое время назад, и это было исправление для моей проблемы.

var directory = new DirectoryInfo(targetDir); 
if (directory.Exists) 
{ 
    Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory(targetDir, Microsoft.VisualBasic.FileIO.DeleteDirectoryOption.DeleteAllContents); 
} 
+0

ehm is это существует в .Net 2? –

+0

Сначала я думаю, что это также визуальный базовый код, я не могу найти его в .Net 2 –

+0

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.filesystem.deletedirectory(v = vs.80) .aspx –

1

Использование Windows API MoveFileEx может быть потенциальным решением с параметром MOVEFILE_DELAY_UNTIL_REBOOT, чтобы удалить файл только после перезагрузки.

Пожалуйста, проверьте http://msdn.microsoft.com/en-us/library/aa365240%28v=vs.85%29.aspx.

+1

Возможно ли это на C#? –

+0

В конце концов самым простым способом было бы назвать собственный код, начиная с C#. Быстрый поиск показывает хороший пример, который наверняка подбодрит вас: http://stackoverflow.com/questions/6077869/movefile-function-in-c-sharp-delete-file-after-reboot-c-sharp – Nostradamus

4

Вы говорите, что файлы не открыты в другом приложении, но он должен быть открыт в вашем приложении:

//Create some directories to delete 
Directory.CreateDirectory("C:/Temp/DeleteMe"); 
Directory.CreateDirectory("C:/Temp/DeleteMe/DeleteMe"); 
File.Create("C:/Temp/DeleteMe/DeleteMeFile");//FileStream still open!! 

//Delete the files 
var directory = new DirectoryInfo("C:/Temp/DeleteMe"); 
if (!directory.Exists) return; 
foreach (FileInfo file in directory.GetFiles()) 
{ 
    file.Delete(); 
} 
foreach (DirectoryInfo dir in directory.GetDirectories()) 
{ 
    dir.Delete(true); 
} 

Убедитесь выбрасыванием потока файла при создании файла

//Create some directories to delete 
Directory.CreateDirectory("C:/Temp/DeleteMe"); 
Directory.CreateDirectory("C:/Temp/DeleteMe/DeleteMe"); 
using (File.Create("C:/Temp/DeleteMe/DeleteMeFile")) { } 

//Delete the files 
var directory = new DirectoryInfo("C:/Temp/DeleteMe"); 
if (!directory.Exists) return; 
foreach (FileInfo file in directory.GetFiles()) 
{ 
    file.Delete(); 
} 
foreach (DirectoryInfo dir in directory.GetDirectories()) 
{ 
    dir.Delete(true); 
} 
7

Я получил эту ошибку и обнаружил, что это потому, что мои тестовые файлы были только для чтения. Изменено это, и теперь я могу использовать fileinfo, чтобы не беспокоить их.

1
if (File.Exists(filePath)) 
{ 
    File.SetAttributes(filePath, FileAttributes.Normal); 
    File.Delete(filePath); 
} 
+0

Хотя это может ответить на вопрос, пожалуйста, также добавьте краткое объяснение, что делает ваш код и почему оно решает начальную проблему. – user1438038

Смежные вопросы