4

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

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);
}

但是没有用。请让我知道我在哪里失踪。

4

6 回答 6

5

请让我知道我在哪里失踪。

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

于 2012-10-04T14:40:19.037 回答
1

如果句柄被另一个进程打开,则不能删除文件。您必须先终止该进程,然后才能删除该文件。

您可以查看此示例以了解如何查找所有打开的句柄。

于 2012-10-04T14:43:33.327 回答
0

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

如果您不知道打开文件的进程是什么,那么您可以使用这样的实用程序,然后处理输出。我自己会重定向输出,然后使用正则表达式来查找我想要获得的过程,但可能有更好的方法。

请记住,这种方法并不完全安全,并且可能会杀死您不想杀死的进程。

于 2012-10-04T14:49:33.563 回答
0

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

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

于 2012-10-04T14:47:26.983 回答
0

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

  1. 做你目前正在做的事情(删除只读属性并尝试删除文件)。
  2. 您可以尝试重命名文件,然后将其删除。
  3. 如果这不起作用,那么您应该打开带有FILE_FLAG_DELETE_ON_CLOSE标志的文件(pinvoke 到CreateFile)。当文件的所有其他句柄都关闭时,系统将为您删除文件。
  4. 如果上面对 CreateFile 的调用由于文件未打开而失败FILE_SHARE_DELETE,那么您应该调用带有标志的MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT(并且 lpNewFileName 参数设置为 NULL / IntPtr.Zero)。这将导致该文件在系统下次重新启动/重新启动时被删除。
  5. 如果第 4 步不可行(即您不能等待重新启动),那么只有这样才能继续执行杀死可能已锁定文件的随机进程的路线。请记住,这可能会导致系统不稳定,特别是如果它是您试图杀死的系统进程。
于 2013-12-30T05:11:39.807 回答
0
foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
{
    if (myProc.ProcessName == "EXCEL")
    {
        myProc.Kill();
        break;
    }
}
于 2018-06-07T11:50:11.137 回答