在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