判断文件是否被打开



判断文件是否被打开

方法一:通过try  catch对文件的移动操作,如果文件打开,将不能移动,会进入catch段代码,通过返回bool值来反应是否能正常移动
 

private void button2_Click(object sender, EventArgs e)
        {
            string filePath = "Test.docx";
            bool bl = isOpen(filePath);
        }
private static bool isOpen(string filePath)
        {
            try
            {
                //第一个 移动文件
                File.Move(filePath, filePath);
                //第二个 读写
                Stream stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
                return true;
            }
            catch(Exception e)
            {
                return false;
            }
        }

 

方法二:_lopen(FileN,OF_READWRITE|OF_SHARE_DENY_NONE)检测返回值
 

 

        [DllImport("kernel32.dll")]
        public static extern IntPtr _lopen(string filePath,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 button3_Click(object sender, EventArgs e)
        {
            string filePath = "Test.docx";
            IntPtr vHandle = _lopen(filePath,OF_READWRITE|OF_SHARE_DENY_NONE);
            if (vHandle == HFILE_ERROR)
            {
                MessageBox.Show("被占用!");
                return;
            }
            CloseHandle(vHandle);
            MessageBox.Show("未被占用!");
            
        }

其中,对应txt文件,当txt文件被记事本打开后,程序不会锁定,对于除txt文件的其他文件,上面的方法都可以正常实现。

我们可以通过对process进程的循环遍历来判断文件是否被notepad打开。

        private void button5_Click(object sender, EventArgs e)
        {
            string fileName="Test.txt";
            Process[] processes = Process.GetProcessesByName("notepad");
            foreach (Process process in processes)
            {
                if (process.MainWindowTitle.Equals(fileName+" - Notepad"))
                {
                    MessageBox.Show("被占用");
                    return;
                }                
            }
        }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值