C# 判断文件是否被占用

C#中判断文件是否被占用一般有两种方法,一是利用FileStream结合try...catch...finally实现,二是调用Windows API实现,下面给出两种方法的代码。

文件流法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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();
}
}
}
}
}

Windows API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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;
}
}
}

参考

原谅链接:https://blog.csdn.net/HerryDong/article/details/115626620