使用c#检测文件正在被那个进程占用 判断文件是否被占用的两种方法

转自:https://www.cnblogs.com/qq458978/p/4517076.html

C# 判断文件是否被占用的三种方法

复制代码

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

[DllImport("kernel32.dll")]
public static extern IntPtr _lopen(string lpPathName, int iReadWrite);

[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);

public const int OF_READWRITE = 2;
public const int OF_SHARE_DENY_NONE = 0x40;
public readonly IntPtr HFILE_ERROR = new IntPtr(-1);
private void button1_Click(object sender, EventArgs e)
{
    string vFileName = @"c:\temp\temp.bmp";
    if (!File.Exists(vFileName))
    {
        MessageBox.Show("文件都不存在!");
        return;
    }
    IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);
    if (vHandle == HFILE_ERROR)
    {
        MessageBox.Show("文件被占用!");
        return;
    }
    CloseHandle(vHandle);
    MessageBox.Show("没有被占用!");
}

复制代码

 上述方法容易导致未占用文件被过程占用了,不可取的检查方案

 

复制代码

public static bool IsFileInUse(string fileName)
 {
        bool inUse = true;

        FileStream fs = null;
        try
        {

            fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,

            FileShare.None);

            inUse = false;
        }
        catch
        {

        }
        finally
        {
            if (fs != null)

                fs.Close();
        }
        return inUse;//true表示正在使用,false没有使用
}

复制代码

 第三种方案

复制代码

  /// <summary>
        /// 返回指示文件是否已被其它程序使用的布尔值
        /// </summary>
        /// <param name="fileFullName">文件的完全限定名,例如:“C:\MyFile.txt”。</param>
        /// <returns>如果文件已被其它程序使用,则为 true;否则为 false。</returns>
        public static Boolean FileIsUsed(String fileFullName)
        {
            Boolean result = false;

            //判断文件是否存在,如果不存在,直接返回 false
            if (!System.IO.File.Exists(fileFullName))
            {
                result = false;

            }//end: 如果文件不存在的处理逻辑
            else
            {//如果文件存在,则继续判断文件是否已被其它程序使用

                //逻辑:尝试执行打开文件的操作,如果文件已经被其它程序使用,则打开失败,抛出异常,根据此类异常可以判断文件是否已被其它程序使用。
                System.IO.FileStream fileStream = null;
                try
                {
                    fileStream = System.IO.File.Open(fileFullName, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);

                    result = false;
                }
                catch (System.IO.IOException ioEx)
                {
                    result = true;
                }
                catch (System.Exception ex)
                {
                    result = true;
                }
                finally
                {
                    if (fileStream != null)
                    {
                        fileStream.Close();
                    }
                }

            }//end: 如果文件存在的处理逻辑

            //返回指示文件是否已被其它程序使用的值
            return result;

        }//end method FileIsUsed

复制代码

 

要检测文件被那个进程占用,需要使用微软提供的工具Handle.exe,这里有微软提供的下载

我们可以在c#中调用Handle.exe 来检测到底哪个进程占用了文件

 

复制代码

string fileName = @"c:\aaa.doc";//要检查被那个进程占用的文件

Process tool = new Process();
tool.StartInfo.FileName = "handle.exe";
tool.StartInfo.Arguments = fileName+" /accepteula";
tool.StartInfo.UseShellExecute = false;
tool.StartInfo.RedirectStandardOutput = true;
tool.Start();           
tool.WaitForExit();
string outputTool = tool.StandardOutput.ReadToEnd();

string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
foreach(Match match in Regex.Matches(outputTool, matchPattern))
{
    Process.GetProcessById(int.Parse(match.Value)).Kill();
}

复制代码

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本系统由用C#语言进行编写和实现,可实现多用户登录。各模块简介如下: 1 文件部分分为C盘和D盘两个磁盘块,在每个磁盘块中均可进行新建、删除、编辑、格式化、显示 属性及个文件等操作。如可新建文件夹、文本文件和可执行文件,并可对新建的文件进行编辑。 此次课程设计中文件系统采用显示链接FAT表。磁盘是断电后内容不丢失的,因此用文件模拟磁盘。要求模拟系统存在两块硬盘:每个磁盘分成128块,每块64字节,第0,1块存放FAT表,第2块存放初始盘快。 文件的逻辑结构采用流式结构; 文件的内容: 文件的内容均采用文本文件,系统中有两种文件: 一种是存放任意字符的文件 一种是可执行文件:可执行文件的内容就是系统内进程的程序体。 文件中要有一种特定命令的“可执行”文件文件中的命令非常简单,仅仅包括以下几种指令: i=?; 给i赋值一位数 i++; i加1 i--; i减1 !??; end; 第一个?为A,B,C中某个设备,第二个?为一位数,表示使用设备的时间(由于没有 实际设备,所以无法知道设备何时工作完成,所以假定一个数,这个数随着系统时间 增加而递减,减到0时,认为是设备工作完成); end. 表示文件结束,同时将结果写入文件out,其中包括文件路径名和i的值。 用户接口 用户接口提供用户命令接口,要求文件名中既可以支持相对路径的文件名,也可支持绝对路径的路径 名。要求实现以下命令: 创建文件:create 盘符:\文件名(目录名).e(t). 建立新文件,如果原来存在同名文件要提示是否覆盖。 拷贝文件:copy 盘符:\文件名(目录名).e(t). to 盘符: 拷贝文件可同名拷贝,也可更名拷贝 删除文件:delete盘符:\ 文件名(目录名).t(e). 注意:磁盘内和磁盘间文件移动的不同,磁盘内的移动实际只是目录的改变,并不需要真的移动文件 ;磁盘间的文件移动实际上是先拷贝文件到目标磁盘,然后再删除源文件。 2 进程部分 进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。 硬件工作的模拟: 中央处理器的模拟 用函数CPU( )(该函数不能有参数)模拟中央处理器。 该函数主要负责解释“可执行文件”中的命令。 i=?; 给i赋值一位数 i++; i加1 i--; i减1 !??; end; 在模拟系统界面上,我们显示了: 就绪队列----进程名称、优先级; 阻塞队列----进程名称、优先级、阻塞原因; 正在运行的进程,该进程的优先级,以及正在运行的指令,中间结果,执行结果; 系统内存的占用情况,剩余空间等,以便显示的提示用户执行新的进程。 注意:CPU只能解释指令寄存器IR中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令 存放到指令寄存器中。 3 存储部分 存储管理部分主要实现主存空 间的分配和回收、存储保护。 模拟系统中,采用页是存储管理方案(PCB区域单独存放) 系统区包括pcb区域 用数组模拟其他内存区域,大小为512字节。 主存分配策略 当有程序要存放入主存时,查看空闲块总数是否够用,如果够用,先分配一块用来存放页表,然后查 位示图中为“0”的位,根据查到的位所在的字号和位号可计算出对应的块号,同时在该位填上占用 标志“1”,并填写页表;不够用,分配失败。 块号=字号*字长+位号 主存回收策略 根据页表归还存储空间时,可以根据归还块的块号推算出在位示图中的位置: 字号=[块号/位示图中字长] 位号=块号mod位示图中字长 然后把这一位的“1”清成“0”,表示该块成为空闲块了 最后回收页表所占用空间 内存部分分为32个物理块,当为分配时均为绿色,分配后变为红色, 进程正在读取的物理块显示 黄色。 4 设备部分 设备管理主要包括设备的分配和回收。 设备的模拟 模拟系统中有A、B、C三种独占型设备,A设备3个,B设备2个,C设备1个。 数据结构 因为模拟系统比较小,因此只要设备表设计合理既可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值