首先,来说一下什么是文件句柄。百度百科的解释是:在文件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;
}
}
}