在C#编程过程中,经常需要读取、写入文件。但是,在文件被其他程序或本程序打开时,会发生文件被占用的情况,此时读取、写入文件将会失败。因此,有必要判断文件是否被占用,以便做出相应处理。
在C#中,可以通过文件句柄(File Handle)实现对文件是否被占用的判断。
具体实现步骤如下:
1. 使用File.Open()方法打开文件,并获取文件句柄,如果文件已经被打开,则会抛出异常。
FileStream fileHandle;
try
{
fileHandle = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
Console.WriteLine("文件已被占用");
return;
}
2. 在文件读写完成后,需要显式地关闭文件句柄。
fileHandle.Close();
上面的方法,是利用文件的异常来判断处理,也可以调用系统底层方法判断
[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 FileHasUse(string filePath)
{
IntPtr vHandle = _lopen(filePath, OF_READWRITE | OF_SHARE_DENY_NONE);
CloseHandle(vHandle);
return vHandle == HFILE_ERROR ? true : false;
}
效果如下图所示.