在日常文件操作中经常会遇到文件读写的问题,但是在多并发现场时需要先判断文件是否被占用,然后才能进行文件的操作;本文主要介绍两种判断文件是否被占用的方法:
1.利用FileAccess的自带方法,文件如果被占用会报IO异常:
private static bool IsFileLocked(string filePath)
{
try
{
using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
// 文件未被锁定
return false;
}
}
catch (IOException)
{
// 文件被锁定
return true;
}
}
//调用bool isFileLocked = IsFileLocked("path/to/file.txt");
2.利用windows API自带方法进行判断,逻辑是获取文件操作的句柄或指针
[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="path"></param>
/// <returns>被打开是返回true</returns>
public static bool IsFileOpen(string path)
{
if (!File.Exists(path))
{
return false;
}
IntPtr vHandle = _lopen(path, OF_READWRITE | OF_SHARE_DENY_NONE);//windows Api上面有定义扩展方法
if (vHandle == HFILE_ERROR)
{
return true;
}
CloseHandle(vHandle);
return false;
}
看到这了,如果您觉得我的文章对您有帮助,我强烈建议您,在能力所极时,给我发一元打赏买瓶水;您的支持将是我无线创作的动力。