LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#检测文件是否被进程占用的实用方法

admin
2025年5月3日 7:53 本文热度 24

在C#开发过程中,当我们需要对文件进行读写、删除等操作时,若文件正被其他进程占用,操作可能会失败并引发异常。因此,检测文件是否被进程占用是很有必要的。下面为你介绍几种实用的检测方法。

一、通过异常处理检测

最直接的方法是尝试打开文件,如果能成功打开,说明文件未被占用;若抛出异常,则表示文件可能被占用。在C#中,可以使用FileStream来实现,示例代码如下:

using System;
using System.IO;

class Program
{
    static bool IsFileOccupied(string filePath)
    {
        try
        {
            using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {
                // 文件成功打开,说明未被占用
                return false;
            }
        }
        catch (IOException)
        {
            // 捕获到IOException异常,说明文件可能被占用
            return true;
        }
    }

    static void Main()
    {
        string fileToCheck = @"C:\example\test.txt";
        if (IsFileOccupied(fileToCheck))
        {
            Console.WriteLine($"文件 {fileToCheck} 被占用。");
        }
        else
        {
            Console.WriteLine($"文件 {fileToCheck} 未被占用。");
        }
    }
}

上述代码中,FileStream尝试以独占方式(FileShare.None)打开文件。如果文件已被其他进程占用,就会抛出IOException异常,从而判断文件处于被占用状态。不过这种方式存在局限性,若其他进程以共享方式打开文件,也可能导致误判。

二、使用Process类遍历进程检测

可以通过遍历系统中所有正在运行的进程,检查每个进程打开的文件句柄,看是否包含目标文件。此方法需要引入System.Diagnostics命名空间,示例代码如下:

using System;
using System.Diagnostics;
using System.IO;

class Program
{
    static bool IsFileOccupiedByProcess(string filePath)
    {
        foreach (Process process in Process.GetProcesses())
        {
            try
            {
                ProcessModuleCollection modules = process.Modules;
                foreach (ProcessModule module in modules)
                {
                    try
                    {
                        if (File.Exists(module.FileName) && Path.GetFullPath(module.FileName) == Path.GetFullPath(filePath))
                        {
                            return true;
                        }
                    }
                    catch { }
                }
            }
            catch { }
        }
        return false;
    }

    static void Main()
    {
        string fileToCheck = @"C:\example\test.txt";
        if (IsFileOccupiedByProcess(fileToCheck))
        {
            Console.WriteLine($"文件 {fileToCheck} 被进程占用。");
        }
        else
        {
            Console.WriteLine($"文件 {fileToCheck} 未被进程占用。");
        }
    }
}

这种方法通过遍历所有进程及其加载的模块,对比模块对应的文件路径与目标文件路径是否一致,来判断文件是否被进程占用。不过该方法会消耗一定性能,因为需要遍历所有进程,而且有些进程可能无法获取其打开的文件句柄信息。

三、使用Win32 API检测

还可以调用Windows系统的Win32 API来检测文件是否被占用。在C#中,需要使用System.Runtime.InteropServices命名空间来进行平台调用。示例代码如下:

using System;
using System.IO;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool DeleteFile(string lpFileName);

    static bool IsFileOccupiedByWin32API(string filePath)
    {
        // 尝试删除文件
        bool result = DeleteFile(filePath);
        // 如果删除失败且错误码为32(ERROR_SHARING_VIOLATION),表示文件被占用
        return!result && Marshal.GetLastWin32Error() == 32;
    }

    static void Main()
    {
        string fileToCheck = @"C:\example\test.txt";
        if (IsFileOccupiedByWin32API(fileToCheck))
        {
            Console.WriteLine($"文件 {fileToCheck} 被占用。");
        }
        else
        {
            Console.WriteLine($"文件 {fileToCheck} 未被占用。");
        }
    }
}

此方法通过调用DeleteFile函数尝试删除文件,如果删除失败且错误码为32(表示共享冲突,即文件被占用),则判断文件处于被占用状态。但这种方式具有一定风险,若误删重要文件可能造成数据丢失。

以上就是C#中检测文件是否被进程占用的几种实用方法,每种方法都有其优缺点,在实际应用中,可根据具体场景选择合适的方式。


阅读原文:原文链接


该文章在 2025/5/6 12:46:13 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved