LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#檢測文件是否被進程占用的實用方法

admin
2025年5月3日 7:53 本文熱度 50

在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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲一区激情国产日韩 | 永久免费AV无语国产 | 亚洲一区亚洲二区欧美一区 | 亚洲国产中文精品高清在线电影 | 尤物欧美一区二区 | 日韩精品一区二区三区在线观看l |