我正在尝试解析文件夹并删除其中的所有文件。
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);
}
但没用。请告诉我我失踪的地方。
答案 0 :(得分:5)
请告诉我我失踪的地方。
您正在关闭文件上的 句柄 - 但这不会影响任何其他文件句柄,无论它们是否由您的进程拥有。基本上你不能删除其他地方使用的文件,除非它已经用文件共享标志显式打开,允许删除它。据我所知,这就是Windows文件系统的工作方式。 (编辑:我最初建议使用记事本作为保持文件句柄打开的一种方式,但显然它在将其加载到内存后关闭句柄。嗯,尝试其他应用程序:)
答案 1 :(得分:1)
如果其他进程打开句柄,则无法删除文件。在删除文件之前,您必须先杀死该进程。
答案 2 :(得分:0)
这是一个方便的工具,用于查找哪个进程具有文件句柄:
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
答案 3 :(得分:0)
如果你知道你的文件打开了哪个程序,你可以直接just taskkill该程序,然后删除你的文件。
如果您不知道文件打开的进程,则可以使用a utility like this,然后处理输出。我自己会重定向输出然后使用正则表达式找到我想要的过程,但可能有更好的方法。
请记住,这种方法并不完全安全,可以杀死你不想杀死的进程。
答案 4 :(得分:0)
这些是您的选择,按照您应该尝试的顺序(从最少侵入性到非侵入性)。
FILE_FLAG_DELETE_ON_CLOSE
标志打开文件(将CreateFile引出)。当关闭文件的所有其他句柄时,系统将为您删除该文件。FILE_SHARE_DELETE
打开而上述对CreateFile的调用失败,则应使用MOVEFILE_DELAY_UNTIL_REBOOT
标志调用MoveFileEx(并将lpNewFileName参数设置为NULL / IntPtr.Zero)。这将导致在下次重启/重启系统时删除该文件。答案 5 :(得分:0)
foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
{
if (myProc.ProcessName == "EXCEL")
{
myProc.Kill();
break;
}
}