文件正在被 C# 中的另一个进程使用

Jos*_*mon 2 c# asp.net filestream

我正在尝试删除 C# 中的文件,但是我收到一条消息,指出该文件已从另一个进程使用。我想要做的是检查文件是否存在并关闭它。我正在使用以下函数来检查文件是否打开:

public static bool IsFileInUse(string path)
    {
        if (string.IsNullOrEmpty(path))
            throw new ArgumentException("'path' cannot be null or empty.", "path");

        try
        {
            using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
        }
        catch (IOException)
        {
            return true;
        }

        return false;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试在使用文件时关闭它:

bool checking = IsFileInUse(file );
File.Create(file ).Close();
if (File.Exists(file))
{
       File.Delete(file );
}
Run Code Online (Sandbox Code Playgroud)

我在 File.Create 行中遇到问题,我收到消息:

文件正被另一个进程使用。

编辑:我正在尝试使用锁定方法来删除文件。我应该删除锁定语句中的文件吗?如何正确使用lock语句?

Adr*_*tti 7

为什么你认为如果文件正在使用,读操作会失败而写操作不会?File.Create()将完全像FileStream()之前失败的新失败一样失败...

另请参阅 IOException: The process cannot access the file 'file path' because it is being used by another process

请注意,如果其他进程没有以独占方式打开该文件(检查FileShare枚举),则您的检查将失败:文件可能会打开以进行共享读取、写入,有时甚至用于删除(例如,您可能能够同时读取但不能写入另一个过程可能会让您删除该文件...)。

关闭一个打开的文件对另一个进程来说可能真的是破坏性的,它可能会崩溃,很好地处理问题或者......其他任何事情(默默地忽略那个错误并产生随机输出,再次打开文件等等......)是吗?可以在 C# 中做到吗?是的,有一些 P/Invoke ......

1) 让我们找到您要解锁的文件的句柄。使用NtQuerySystemInformation()并枚举所有句柄,直到找到引用该文件的句柄。

2) 使用DuplicateHandle().

3) 关闭仅指定创建句柄DUPLICATE_CLOSE_SOURCE,它将关闭您的句柄和原始句柄(当然,如果您的进程具有足够的权限)。

4)检查文件是否真的关闭NtQuerySystemInformation()再次调用,如果没有,则可能需要直接关闭其父进程。