[C#.Net]判断文件是否被占用的两种方法

[C#.Net]判断文件是否被占用的两种方法

今天开发产线测试Tool时发现日志文件会几率性的被占用,上网浏览找到最简单的代码(API或者FileStream),在这里抛砖引玉下。

第一种方法:API

 1 using System.IO;  
 2 using System.Runtime.InteropServices;  
 3  
 4 [DllImport("kernel32.dll")]  
 5 public static extern IntPtr _lopen(string lpPathName, int iReadWrite);  
 6 
 7 [DllImport("kernel32.dll")]  
 8 public static extern bool CloseHandle(IntPtr hObject);  
 9  
10 public const int OF_READWRITE = 2;  
11 public const int OF_SHARE_DENY_NONE = 0x40;  
12 public readonly IntPtr HFILE_ERROR = new IntPtr(-1);  
13 private void button1_Click(object sender, EventArgs e)  
14 {  
15     string vFileName = @"c:\temp\temp.bmp";  
16     if (!File.Exists(vFileName))  
17     {  
18         MessageBox.Show("文件都不存在!");  
19         return;  
20     }  
21     IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);  
22     if (vHandle == HFILE_ERROR)  
23     {  
24         MessageBox.Show("文件被占用!");  
25         return;  
26     }  
27     CloseHandle(vHandle);  
28     MessageBox.Show("没有被占用!");  
29 }  

第二种方法:FileStream

 1 public static bool IsFileInUse(string fileName)  
 2  {  
 3         bool inUse = true;  
 4   
 5         FileStream fs = null;  
 6         try  
 7         {  
 8   
 9             fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,  
10   
11             FileShare.None);  
12   
13             inUse = false;  
14         }  
15         catch  
16         {   
17         }  
18         finally  
19         {  
20             if (fs != null)  
21   
22                 fs.Close();  
23         }  
24         return inUse;//true表示正在使用,false没有使用  
25 }  

项目代码的部分(VB.Net)

 1  Sub Prepare()
 2         If File.Exists(logRW) Then File.Delete(logRW)
 3         Dim bflag As Boolean = False
 4         Try
 5             Do
 6                 Shell("CMD.exe /C RW.exe /Command=LimitA.rw /LogFile=LimitA.log", AppWinStyle.Hide, True, 5000)
 7                 Threading.Thread.Sleep(1000)
 8                 While (IsFileInUse("LimitA.log"))
 9                     Threading.Thread.Sleep(2000)
10                 End While
11 
12                 If File.Exists(logRW) Then
13                     Dim All As String = My.Computer.FileSystem.ReadAllText(logRW)
14                     '检查LogRW的0x01的位置的值是否为0x08
15                     If All.Contains("Read EC Byte 0x01 = 0x80") Then
16                         bflag = True
17                     End If
18                 End If
19             Loop Until bflag
20 
21             Using sr As New StreamReader(logRW)
22                 Do Until sr.EndOfStream
23                     Dim s As String = sr.ReadLine
24                     If s.Contains("Set Environment RwLOCAL3") Then
25                         'Set Environment RwLOCAL3 = 4608 (DEC)
26                         LimitA = CDbl(s.Split(New String() {"=", "("}, StringSplitOptions.RemoveEmptyEntries)(1))
27                         Console.WriteLine("Limit Current: " & LimitA)
28                         LogStr = LogStr & vbCrLf & "Limit Current: " & LimitA
29                         Exit Do
30                     End If
31                 Loop
32             End Using
33 
34         Catch ex As Exception
35             Console.WriteLine(ex.Message & Err.Description)
36             Environment.Exit(1)
37         End Try
38     End Sub
39 
40     Function IsFileInUse(ByVal fileName As String)
41         Dim inUse As Boolean = True
42         Dim fs As FileStream = Nothing
43         Try
44             fs = New FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None)
45             inUse = False
46         Catch ex As Exception
47 
48         Finally
49             If (fs IsNot Nothing) Then
50                 fs.Close()
51             End If
52         End Try
53         Return inUse
54     End Function
原文地址:https://www.cnblogs.com/grj001/p/12224478.html