如何通过C#来操作文件句柄

首先,来说一下什么是文件句柄。百度百科的解释是:在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。

来说下应用场景,举个简单的例子,比如说你想操作某个文件,但是在操作的时候不想让其他程序(进程)访问这个文件,这时候我们就需要用到句柄了。

下面就是一个简单的代码例子,可以直接拿来使用。

 

    /// <summary>
    /// 文件句柄操作类
    /// </summary>
    public class FileHandleAPI
    {
        #region 文件访问模式
        public const int OF_READ = 0;
        public const int OF_WRITE = 1;
        public const int OF_READWRITE = 2;
        #endregion

        #region 共享模式(参考OpenFile函数的标志常数表)
        public const int OF_SHARE_COMPAT = 0x0;      //文件可由多个应用程序打开多次
        public const int OF_SHARE_EXCLUSIVE = 0x10;  //其他任何一个程序都不能再打开这个文件
        public const int OF_SHARE_DENY_WRITE = 0x20; //其他程序可以读文件,但不能写文件
        public const int OF_SHARE_DENY_READ = 0x30;  //禁止其他程序读写文件内容
        public const int OF_SHARE_DENY_NONE = 0x40;  //可打开文件,以便由其他程序读写
        #endregion

        public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);


        /// <summary>
        /// 获取当前线程文件句柄
        /// </summary>
        /// <param name="lpPathName">file path</param>
        /// <param name="iReadWrite"></param>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        public static extern IntPtr _lopen(string lpPathName, int iReadWrite);

        /// <summary>
        /// 关闭当前线程的文件句柄
        /// </summary>
        /// <param name="hObject"></param>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        public static extern bool CloseHandle(IntPtr hObject);

        /// <summary>
        /// 检查当前文件的句柄是否被占用
        /// </summary>
        /// <param name="filePath">file path</param>
        /// <returns></returns>
        public static bool IsOpen(string filePath)
        {
            IntPtr vHandle = _lopen(filePath, OF_READWRITE | OF_SHARE_EXCLUSIVE);
            if (vHandle == HFILE_ERROR)
            {
                return true;
            }
            else
            {
                CloseHandle(vHandle);
                return false;
            }
        }
    }

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值