如何关闭已在目录中打开的文件

时间:2012-10-04 14:37:43

标签: c# file directory delete-file

我正在尝试解析文件夹并删除其中的所有文件。

DirectoryInfo dir = new DirectoryInfo("C\\Temp");
if (dir.GetDirectories().Any(p => p.Name == "\\NewTemp"))
{
    foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
    {
        File.SetAttributes(file, FileAttributes.Normal);
        File.Delete(file);
    }
}

此代码可以正常工作并删除\ NewTemp文件夹中的所有文件。但是如果打开任何文件,那么这些文件将不会被删除。我想要先关闭打开的文件并删除它们。我甚至试过

foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
{
    TextReader tr = new StreamReader(dir+"\\NewTemp\\"+file);
    tr.Close();
    File.SetAttributes(file, FileAttributes.Normal);
    File.Delete(file);
}

但没用。请告诉我我失踪的地方。

6 个答案:

答案 0 :(得分:5)

  

请告诉我我失踪的地方。

您正在关闭文件上的 句柄 - 但这不会影响任何其他文件句柄,无论它们是否由您的进程拥有。基本上你不能删除其他地方使用的文件,除非它已经用文件共享标志显式打开,允许删除它。据我所知,这就是Windows文件系统的工作方式。 (编辑:我最初建议使用记事本作为保持文件句柄打开的一种方式,但显然它在将其加载到内存后关闭句柄。嗯,尝试其他应用程序:)

答案 1 :(得分:1)

如果其他进程打开句柄,则无法删除文件。在删除文件之前,您必须先杀死该进程。

您可以查看此example to see how to find all open handles.

答案 2 :(得分:0)

这是一个方便的工具,用于查找哪个进程具有文件句柄:

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

答案 3 :(得分:0)

如果你知道你的文件打开了哪个程序,你可以直接just taskkill该程序,然后删除你的文件。

如果您不知道文件打开的进程,则可以使用a utility like this,然后处理输出。我自己会重定向输出然后使用正则表达式找到我想要的过程,但可能有更好的方法。

请记住,这种方法并不完全安全,可以杀死你不想杀死的进程。

答案 4 :(得分:0)

这些是您的选择,按照您应该尝试的顺序(从最少侵入性到非侵入性)。

  1. 执行您当前正在执行的操作(删除只读属性并尝试删除该文件)。
  2. 您可以尝试重命名该文件,然后将其删除。
  3. 如果这不起作用,那么您应该使用FILE_FLAG_DELETE_ON_CLOSE标志打开文件(将CreateFile引出)。当关闭文件的所有其他句柄时,系统将为您删除该文件。
  4. 如果由于文件未使用FILE_SHARE_DELETE打开而上述对CreateFile的调用失败,则应使用MOVEFILE_DELAY_UNTIL_REBOOT标志调用MoveFileEx(并将lpNewFileName参数设置为NULL / IntPtr.Zero)。这将导致在下次重启/重启系统时删除该文件。
  5. 如果第4步不可行(即你不能等待重启),那么只有这样才能继续杀掉可能锁定文件的随机进程。请记住,这可能会导致系统不稳定,特别是如果它是您要杀死的系统进程。

答案 5 :(得分:0)

foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
{
    if (myProc.ProcessName == "EXCEL")
    {
        myProc.Kill();
        break;
    }
}