在我的应用程序中,我需要删除文件,然后删除包含这些文件的目录。如果没有文件打开,它的效果很好。
但是如果任何文件是打开的(即index.txt
),它就会成功从目录中删除,并且在删除目录时会抛出类似file is used by other application
的异常。
有没有办法用p / invoke或其他任何东西关闭C#中的打开文件?
答案 0 :(得分:3)
删除当前由其他应用程序打开的文件的唯一方法是让这些应用程序释放对文件的锁定(通常通过关闭文件)或终止应用程序本身。
显然,强制外部应用程序终止以删除应用程序当前正在打开的文件通常会导致灾难!
答案 1 :(得分:0)
如果您注意到,当您打开MS Office文件时,它会创建一个" shadow"文件附近 - 这就像在RAM存储文件中。因此,如果您删除真实文件" shadow"文件保留在目录中。所以RAM使用你的目录。
换句话说,我认为不可能在C#中做到这一点。
答案 2 :(得分:0)
基本上,打破此链接并确定它的唯一方法是从您的其他进程中删除。有各种方法可以做到这一点,已经指出了,但更好的问题是你是否应该这样做。
我建议调查一个try
-catch
模式并让您的应用程序向用户报告错误,而不是从用户的角度出发,尝试删除可能打开的文档。系统本身。
另请注意,杀死外部进程不是一个经过验证的解决方案,因为有多种情况“杀死外部进程”步骤可能会失败(目标进程以管理员身份运行,而您的应用程序不是,它设置为Windows服务的目标进程,并在完成删除之前重新启动,目标进程是一个无法终止的系统关键进程,等等。
答案 3 :(得分:0)
以下代码适用于.doc文件。
但不适用于.txt文件。它不会为.txt抛出任何异常 仍在搜索适用于.txt文件的解决方案。
我通过Window Explorer打开文件,而不是通过任何代码。
public static void Main()
{
String file;
file = "C:\\Temp\\test.doc";
bool b=IsCloseFile(file);
if (b)
MessageBox.Show("File Open");
}
public static bool IsCloseFile(string file)
{
FileStream stream = null;
try
{
stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException e)
{
return true;
}
finally
{
if (stream != null)
stream.Close();
}
return false;
}
}