精华内容
下载资源
问答
  • 转自:... C# 判断文件是否被占用的三种方法 using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.dll")] public static extern IntPtr _lopen(string ...

    转自: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();
    }

    复制代码

    展开全文
  • 最近遇到一个问题,我在实现一个C#客户端的附件上传功能时,只能上传未被其他进程占用的文件,因此每次上传文件前需要先判断被选中文件是否被占用。...我上网查了下使用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

    展开全文
  • if(file.renameTo(file)){  //文件没有 }

    if(file.renameTo(file)){

      //文件没有被占用

    }

    展开全文
  • C#实现判断文件是否被占用与解除文件占用  收藏 北风其凉   发表于 8个月前 阅读 930 收藏 2 点赞 0 评论 0   最近遇到一个问题,我在实现一个C#客户端的附件...
    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

    我实现了一个函数:

    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# 判断文件是否被占用的可以用下面的方法     1 2 3 4 5 6 7 8 9 10 11 12
  • 判断文件是否被占用的两种方法

    万次阅读 热门讨论 2017-05-01 09:34:21
    第一种方法:采用文件流方式;打开进行读取操作,看看是否可以;(亲自尝试,完全正确) public static bool IsFileInUse(string fileName) { bool inUse = true; FileStream fs = null; try { fs = new ...
  • 怎么判断文件是否被占用

    千次阅读 2012-07-31 15:26:57
    解决方法是利用CreateFile来判断这个文件是否被被其他进程以独占的方式占用了. 也可以用来判断 文件是否上传复制完毕,文件大小、操作时间的更改等。 代码: #include using namespace std; //#include #...
  • Java和C++判断文件是否被占用

    千次阅读 2018-12-18 14:51:44
    很多CSDN上的博客以及stackoverflow上的解决方法 Java 1. RandomAccessFile try { File file = new File("E:\\javaprojects\\file.py"); System.out.println(file.exists()); RandomAccessFile raf = ...
  • C++ /MFC 判断文件是否被占用

    千次阅读 2019-11-02 08:54:25
    HANDLE Handle; Handle = CreateFile(szPath, GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(INVALID_HANDLE_VALUE == Handle) ...AfxMessageBox("文件被占用"); return; } CloseHandle...
  • 打开一下文件就知道有没有被占用了,占用了... /// 判断文件是否被占用,返回bool值,被占用返回True /// </summary> /// <param name="fileName">带文件名的路径,带后缀</param> /// <re...
  • C# 判断文件是否被占用的两种方法

    万次阅读 2012-02-29 11:08:00
    1.第一种方法: using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.dll")] public static extern IntPtr _lopen(string lpPathName, int iReadWrite); [DllImport("kernel32.dll")] ...
  • 第一种方法:API using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.dll")] public static extern IntPtr _lopen(string lpPathName, int iReadWrite); [DllImport("kernel32....
  • c++ windows上判断文件是否被占用

    千次阅读 2019-12-09 15:46:52
    所需头文件: #include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/locking.h> #include <share.h> #include <...bool IsFileUsed(const c...
  • C# 判断文件是否被占用

    千次阅读 2013-06-20 09:34:29
    using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.dll")] ... MessageBox.Show("文件被占用!"); return; } CloseHandle(vHandle); MessageBox.Show("没有被占用!"); }
  • 如何用Python判断一个文件是否被占用

    万次阅读 多人点赞 2020-12-15 11:17:46
    今天有同学问,用os模块的access()能否判断一个文件是否被占用?直觉上,这是行不通的,因为access()返回的是文件的读写属性。后来,群里有同学建议说,不妨用try尝试着open文件,如果成功,表示文件没有被占用,...
  • 文件是否被占用
  • 如果小文件还好一点,拷贝就是一瞬间的事情,但是如果是一个大文件,比如10G的文件可能就需要花费较长时间才能完成文件数据的传输,而对文件的处理肯定得保证文件数据的完整性,这边就得提到文件是否正在传输过程中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 273,480
精华内容 109,392
关键字:

判断文件是否被占用的方法