C#实现判断文件是否被占用与解除文件占用

最近遇到一个问题,我在实现一个C#客户端的附件上传功能时,只能上传未被其他进程占用的文件,因此每次上传文件前需要先判断被选中文件是否被占用。尤其是PDF文件,当以AdobeReaderXI打开时,文件会处于占用状态,此时若强行上传,会触发异常。

我上网查了下使用C#判断文件是否被占用的方法。参考了这篇博客:

http://www.cnblogs.com/MR520/archive/2012/03/20/2408782.html

我实现了一个函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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

namespace FileStatusTest
{
    public class FileStatusHelper
    {
        [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 static readonly IntPtr HFILE_ERROR = new IntPtr(-1);  

        /// <summary>
        /// 查看文件是否被占用
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static bool IsFileOccupied(string filePath)
        {
            IntPtr vHandle = _lopen(filePath, OF_READWRITE | OF_SHARE_DENY_NONE);
            CloseHandle(vHandle);
            return vHandle == HFILE_ERROR ? true : false;
        }
    }
}

调用方法为:

if (FileStatusHelper.IsFileOccupied(@"文件路径"))
{
    MessageBox.Show("文件已被占用");
}
else
{
    MessageBox.Show("文件未被占用");
}

测试结果如下:

1、设有一PDF文件,打开前调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

2、使用AdobeReaderXI打开此PDF文件,调用函数FileStatusHelper.IsFileOccupied,显示【文件已被占用】

3、关闭AdobeReaderXI后调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

在我遇到的场景中,实现对文件是否被占用进行判别就可以了,如文件已被占用,给出相应提示并让用户自己关闭占用文件的进程即可。

不过,在好奇心的驱使下,我还是查了下如何使用C#语言解除其他进程对文件的占用。我用搜索引擎初步找了一下,发现要想仅使用C#做到这些还真不太容易。

后来我参考了这个stackoverflow上的问题:

http://stackoverflow.com/questions/242882/how-can-i-unlock-a-file-that-is-locked-by-a-process-in-net

里面给出了一个建议,使用Unlocker软件的命令行参数实现对指定文件的解锁。

我从百度上下载的Unlocker1.9.2,下载地址如下:

http://dlsw.baidu.com/sw-search-sp/soft/c0/12918/Unlocker1.9.2.exe

安装此程序后,使用下面的命令即可直接解锁指定文件:

Unlocker.exe 要解锁的文件名 /s

如果一定要使用C#解锁某一被占用的文件,可在Unlocker安装目录中将这四个文件提取出来:Unlocker.exe、UnlockerCOM.dll、UnlockerDriver5.sys、UnlockerHook.dll。将它们放到我们程序目录中,通过Process.Start方法调用Unlocker.exe,并附带上相关参数,就可以实现用C#代码解锁某一指定文件了。另有一点需要注意,运行Unlocker.exe时需要用到管理员权限。

使用此方法测试结果如下:

1、设有一PDF文件,打开前调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

2、使用AdobeReaderXI打开此PDF文件,调用函数FileStatusHelper.IsFileOccupied,显示【文件已被占用】

3、使用Unlocker解锁后,调用函数FileStatusHelper.IsFileOccupied,显示【文件未被占用】

END

转载于:https://my.oschina.net/Tsybius2014/blog/780750

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值