C# 如果通过窗口资源管理器打开,请关闭文件

C# 如果通过窗口资源管理器打开,请关闭文件,c#,.net,file,C#,.net,File,在我的应用程序中,我需要删除文件,然后删除包含这些文件的目录。如果所有文件都未打开,则效果非常好 但是,如果任何文件打开(即index.txt),它将成功地从目录中删除,并且在删除目录时,它会抛出一个异常,如文件被其他应用程序使用 有没有办法用p/invoke或其他方法关闭C#中打开的文件?删除当前由其他应用程序打开的文件的唯一方法是让这些应用程序释放文件锁(通常通过关闭文件)或终止应用程序本身 显然,强制外部应用程序终止以删除应用程序当前保持打开状态的文件通常会导致灾难 如果您注意到,当您打开

在我的应用程序中,我需要删除文件,然后删除包含这些文件的目录。如果所有文件都未打开,则效果非常好

但是,如果任何文件打开(即
index.txt
),它将成功地从目录中删除,并且在删除目录时,它会抛出一个异常,如
文件被其他应用程序使用


有没有办法用p/invoke或其他方法关闭C#中打开的文件?

删除当前由其他应用程序打开的文件的唯一方法是让这些应用程序释放文件锁(通常通过关闭文件)或终止应用程序本身


显然,强制外部应用程序终止以删除应用程序当前保持打开状态的文件通常会导致灾难

如果您注意到,当您打开MS Office文件时,它会在附近创建一个“影子”文件,这类似于RAM中存储的文档。因此,如果删除真实文件,“影子”文件将保留在目录中。所以RAM使用你的目录


换句话说,我认为在C#中不可能做到这一点。

基本上,打破这个链接并确保它的唯一方法是从您的进程中删除其他进程。已经指出,有多种方法可以做到这一点,但更好的问题是你是否应该这样做

我建议您研究一种模式,让您的应用程序向用户报告错误,而不是从用户甚至系统本身的角度积极尝试删除一个可能出于非常好的原因而打开的文档


还要注意,杀死外部进程并不是一个通用的解决方案,因为在很多情况下,“杀死外部进程”步骤可能会失败(目标进程以管理员身份运行,而您的应用程序不是,目标进程它设置为Windows服务,并在您完成删除之前自行重新启动,目标进程是一个无法终止的系统关键进程等。)

以下代码适用于.doc文件

但不适用于.txt文件。它不会为.txt引发任何异常 仍在搜索使用.txt文件的解决方案

我通过窗口资源管理器打开文件,而不是通过任何代码

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

根据,似乎可以确定哪个应用程序打开了一个文件。但是,正在使用的程序/库不能与应用程序一起分发,因此如果这是一件事情的话,它将无法离开生产环境。但正如Rich所说,贪婪的应用程序会杀死其他专业人员是一个坏主意我认为如果执行帐户没有提升到足够的高度,甚至可能引发权限错误。