8

我的控制台应用程序在工作时正在创建一些运行时文件,所以我想做的是在应用程序启动时删除所有这些文件。我试过这个:

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. 该文件可以毫无问题地手动删除,这就是我在这里的原因。
4

5 回答 5

8

我收到此错误,发现这是因为我的测试文件是只读的。改变了这一点,我现在可以使用 fileinfo 删除它们,不用担心。

于 2013-07-08T14:47:23.250 回答
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);
}
于 2013-03-07T00:36:21.370 回答
4
if (File.Exists(filePath))
{
    File.SetAttributes(filePath, FileAttributes.Normal);
    File.Delete(filePath);
}
于 2017-08-10T02:25:59.933 回答
2

使用 Windows API MoveFileEx 可能是一个潜在的解决方案,其参数 MOVEFILE_DELAY_UNTIL_REBOOT 仅在重新启动后删除文件。

请检查http://msdn.microsoft.com/en-us/library/aa365240%28v=vs.85%29.aspx

于 2013-03-06T23:31:43.103 回答
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);
}
于 2013-03-06T23:49:42.793 回答