今天开发产线测试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