c# - c#中的另一个进程正在使用文件

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

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

bool checking = IsFileInUse(file );
File.Create(file ).Close();
if (File.Exists(file))
{
       File.Delete(file );
}

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

File is being used by another process.

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

最佳答案

为什么你认为如果文件正在使用,读操作会失败,而写操作不会? File.Create() 将完全失败,因为 new 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) Close just create handle specifying DUPLICATE_CLOSE_SOURCE,它会关闭你的句柄和原来的句柄(当然如果你的进程有足够的权限)。

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

关于c# - c#中的另一个进程正在使用文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35057709/

相关文章:

c# - 从 .tlb 文件创建互操作 dll

c# - 带有事件处理程序的 HttpClient 扩展

php - cURL 将数据发布到 asp.net 页面

c# - 如何估计待打印字符串的长度?

c# - RandomNumberGenerator 与 Aes 生成 key 。使用 AES 加密时,我应该使用哪个来获取 key (C#)

asp.net - 组装信息

javascript - jQuery 修改隐藏字段值回发到服务器时为空

c# - 如何生成通过 FileStream 写入的数据已在磁盘上的通知?

c++ - 使用相同流对象的 io 操作

c++ - 从文件中查找最后一个字母为 'a' 的单词