`
wx1569582009
  • 浏览: 123772 次
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    C# 文件 文件夹 解除占用

    Unlock Monopoly 文件/文件夹 解除占用或直接删除。 编程语言:C# 这个就不用过多功能描述...文件夹解除占用:遍历文件夹所有文件,判断是否被占用,先解除文件占用,后解除文件夹占用,然后删除文件,最后删除文件夹。

    C# 当在文件拷贝后,再接着后面操作 ,会提示文件被占用 ,导致后面的操作异常

    然而,有时在尝试进行文件复制后立即执行其他操作时,可能会遇到“文件被占用”的错误,这将导致后续操作异常。这个问题通常是由于文件复制过程尚未完全完成,或者操作系统仍保持着对源文件或目标文件的锁定。为了...

    C#写的检查TCP、UDP端口是否被占用

    C#写的检查TCP、UDP端口是否被占用,原理就是利用netstat -a,在得到的结果当中检索端口是否被占用,有时候运行有点慢,注意的是有些知名端口的检查结果是错误的(因为在netstat -a运行结果当中,知名端口没有用数字...

    C#解决文件被占用资源,无法删除或修改的方法

    例如,可以尝试检测文件是否被其他进程占用,并等待一段时间直到该进程释放文件资源。在C#中,可以通过调用System.IO的静态方法FileShare来检查文件是否被其他进程使用。如果该方法返回true,则表示文件可以被其他...

    C# WPF 监测U盘插拔 解除U盘占用

    本文将深入探讨如何使用C# WPF来监测U盘的插拔以及如何解除U盘占用的问题。 首先,我们需要理解Windows操作系统是如何处理硬件事件,特别是USB设备的插入和移除。Windows通过即插即用(Plug and Play, PnP)机制...

    获取文件大小并删除文件夹里的文件

    在实际的Windows Forms应用中,别忘了添加适当的错误处理,如检查文件是否存在、用户是否有权限执行操作等。 综上所述,"获取文件大小并删除文件夹里的文件"在C#中主要涉及`FileInfo`和`DirectoryInfo`类的使用,...

    C# winform 运行前释放令一个文件(或DLL)

    在C# WinForm应用开发中,有时为了保护代码或者实现某些特定功能,我们可能需要在程序运行时动态加载外部文件,比如DLL(动态链接库)文件。标题中的“C# WinForm 运行前释放令一个文件(或DLL)”指的就是这种技术。...

    C# Tool_文件粉碎机.rar

    基于C#的文件粉碎机,具备以下功能: 1、可以删除文件并防止恢复; 2、删除文件创建、修改时间; 3、删除文件名,恢复时...4、支持强制删除,在文件被占用时可以解除占用并删除(需要管理员权限); 5、绿色免安装。

    解锁正在被使用的文件

    1. 使用Windows任务管理器:按`Ctrl+Shift+Esc`打开任务管理器,切换到"详细信息"或"服务"标签页,然后通过右键点击任何进程并选择"打开文件位置"来检查是否与锁定的文件关联。 2. 使用资源监视器:按`Ctrl+Shift+...

    C# winform 图片连续性切换显示

    在C# WinForm应用开发中,我们经常需要实现图片的动态展示效果,比如连续性切换显示,这在创建幻灯片、图像展示软件或者游戏场景切换等场景中非常常见。本教程将详细介绍如何利用C# WinForm的PictureBox控件来实现...

    C# WinForm应用程序降低系统内存占用方法总结

    在开发C# WinForm应用程序时,内存管理是一个关键的考虑因素,因为不恰当的内存使用可能导致应用程序占用过多系统资源,从而影响性能和用户体验。本文总结了9种方法来降低C# WinForm应用程序的内存占用,旨在帮助...

    查找系统锁定文件小工具

    这款.exe文件很可能是用C++、C#、Java等编程语言编写,并利用操作系统提供的API函数来实现查找和结束占用文件的进程的功能。 在实际使用中,该工具可能会通过以下步骤工作: 1. 扫描系统当前的进程列表,获取每个...

    C#程序提示“正由另一进程使用,因此该进程无法访问该文件”的解决办法

    Console.WriteLine("文件已被其他进程占用:" + ex.Message); } ``` #### 2. 关闭或释放文件句柄 如果文件是由你的程序本身打开的,确保在完成操作后正确关闭文件。使用`FileStream`类时,记得调用`Dispose()`...

    ShareKiller删除共享文件夹().rar

    3. **解除文件锁定**:如果文件夹被其他进程占用,ShareKiller可能会尝试释放这些占用。C#的File Unlocker功能可以用来检测并解除文件锁。 4. **删除物理文件夹**:最后,使用Directory.Delete方法删除实际的文件夹...

    C#音乐播放器(带歌词下载)

    通常,这种功能会依赖于第三方歌词服务提供商,如LRC格式的歌词文件,这些文件包含了时间戳和歌词内容,播放器通过解析这些信息来实现歌词与音乐的同步滚动。为确保歌词的准确性和完整性,开发者需要对接多个歌词源...

    超级文件删除器公测版

    《超级文件删除器公测版》是一款专为解决顽固文件删除问题而设计的软件,由C#编程语言实现。这款工具的出现,为那些在常规操作下无法正常删除的文件提供了解决方案,尤其针对那些由于系统权限、程序占用或者病毒感染...

    VS文件批量解锁工具_免安装版.rar

    为了解决这一问题,开发者社区中有人编写了一个名为“VS文件批量解锁工具”的实用程序,该工具专为VS用户设计,可以有效地解除那些被锁死的文件,使其能够被删除、修改或替换。更为重要的是,这款工具是免安装版,...

    c#屏幕锁定程序

    本项目名为“C#屏幕锁定程序”,它旨在为用户提供一个简单而实用的工具,以便在进行换班管理或者需要暂时离开电脑时保护屏幕内容不被他人查看。下面将详细介绍这个项目的相关知识点。 1. C#基础:C#是微软开发的一...

    unlocker

    汇编语言则用于实现核心的文件解锁功能,确保程序能够精确地找到并解除文件的占用状态。这种混合编程方式在软件开发中并不罕见,它能够充分利用高级语言的易用性和低级语言的效率,实现最佳的程序性能。 "Unlocker...

Global site tag (gtag.js) - Google Analytics