实现判断文件是否被占用与解除文件占用
2017-06-23 17:50
253 查看
https://my.oschina.net/Tsybius2014/blog/780750
C#实现判断文件是否被占用与解除文件占用
收藏
北风其凉
发表于 8个月前
阅读 930
收藏 2
点赞 0
评论 0
最近遇到一个问题,我在实现一个C#客户端的附件上传功能时,只能上传未被其他进程占用的文件,因此每次上传文件前需要先判断被选中文件是否被占用。尤其是PDF文件,当以AdobeReaderXI打开时,文件会处于占用状态,此时若强行上传,会触发异常。
我上网查了下使用C#判断文件是否被占用的方法。参考了这篇博客:
http://www.cnblogs.com/MR520/archive/2012/03/20/2408782.html
我实现了一个函数:
调用方法为:
测试结果如下:
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
安装此程序后,使用下面的命令即可直接解锁指定文件:
如果一定要使用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
C#实现判断文件是否被占用与解除文件占用
收藏
北风其凉
发表于 8个月前
阅读 930
收藏 2
点赞 0
评论 0
最近遇到一个问题,我在实现一个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
相关文章推荐
- C#实现判断文件是否被占用与解除文件占用
- 怎么判断文件是否被占用
- C# 判断文件是否被占用的两种方法
- C# 判断文件是否被占用的两种方法
- ajax判断远程文件是否存在 后台代码实现
- linux 判断文件最后更新时间 实现监控日志是否有输出功能
- 23.VC(custom)-怎么判断文件是否被占用
- 通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件。
- 判断文件类型是否为图片的方法——Java实现
- C# 判断文件是否被占用
- 判断文件是否被占用
- 通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件
- 判断一个文件是否被占用
- 怎么判断文件是否被占用
- c# 判断指定文件是否存在的简单实现
- C#判断文件是否被打开占用
- 判断文件是否已被占用
- 9-18 ASP第二讲实现数据的真实操作,从txt文件中读取进行校对,判断登陆是否成功
- 判断文件是否被占用的方法
- PHP判断远程图片或文件是否存在的实现代码