1、前言
在C#
中判断文件是否被占用一般有两种方法,一是利用FileStream
结合try...catch...finally
实现,二是调用Windows API
实现,下面给出两种方法的代码。
2、文件流法
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
string filePath = @"D:\data.xlsx";
bool occupied = IsOccupied(filePath);
if (occupied)
{
Console.WriteLine("文件被占用");
}
else
{
Console.WriteLine("文件未被占用");
}
Console.ReadKey(true);
}
static bool IsOccupied(string filePath)
{
FileStream stream = null;
try
{
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None);
return false;
}
catch
{
return true;
}
finally
{
if (stream != null)
{
stream.Close();
}
}
}
}
}
3、Windows API法
using System;
using System.Runtime.InteropServices;
namespace ConsoleApp3
{
class Program
{
// 判断文件是否打开
[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);
static void Main(string[] args)
{
string filePath = @"D:\data.xlsx";
bool occupied = IsOccupied(filePath);
if (occupied)
{
Console.WriteLine("文件被占用");
}
else
{
Console.WriteLine("文件未被占用");
}
Console.ReadKey(true);
}
static bool IsOccupied(string filePath)
{
IntPtr handler = _lopen(filePath, OF_READWRITE | OF_SHARE_DENY_NONE);
CloseHandle(handler);
return handler == HFILE_ERROR;
}
}
}