• [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:	emp	emp.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
  • 相关阅读:
    Web服务技术协议:REST与SOAP
    几种常见的Web服务器
    在浏览器中输入网址后是怎么跳转到指定的服务器的
    forward(请求转发)和redirect(重定向)的区别
    Hook钩子编程
    闭包
    JSP
    临界区与锁
    进程
    LeetCode Search for a Range
  • 原文地址:https://www.cnblogs.com/masonlu/p/6867122.html
Copyright © 2020-2023  润新知