在C#中,我可以使用FileSystemWatcher对象来监视特定文件,并在创建,修改等事件时引发事件.
我在这个类中遇到的问题是,即使创建文件的进程仍在编写过程中,它也会在创建文件的那一刻引发事件.我发现这是非常有问题的,特别是如果我试图读取类似XML文档的东西,其中文件必须具有一些结构,在完成编写之前不会存在.
.NET(最好是2.0)是否有任何方法可以在文件可访问后引发事件,或者我是否必须不断尝试读取该文件,直到它不会抛出异常才知道它可用?
您可以使用文件系统观察程序来检查文件何时更改.只有在文件先前关闭文件的程序之后,它才会变为"已更改".我知道你要求C#,但我的VB.Net要好得多.希望你或其他人可以翻译.
它尝试打开文件,如果它不可用,它会添加一个观察程序,并等待文件被更改.文件更改后,它会再次尝试打开.如果等待超过120秒,它会抛出异常,因为您可能会遇到永远不会释放文件的情况.此外,我决定添加等待文件更改5秒的超时,以防在创建实际文件观察程序之前文件被关闭的可能性很小.
Public Sub WriteToFile(ByVal FilePath As String, ByVal FileName As String, ByVal Data() As Byte)
Dim FileOpen As Boolean
Dim File As System.IO.FileStream = Nothing
Dim StartTime As DateTime
Dim MaxWaitSeconds As Integer = 120
StartTime = DateTime.Now
FileOpen = False
Do
Try
File = New System.IO.FileStream(FilePath & FileName, IO.FileMode.Append)
FileOpen = True
Catch ex As Exception
If DateTime.Now.Subtract(StartTime).TotalSeconds > MaxWaitSeconds Then
Throw New Exception("Waited more than " & MaxWaitSeconds & " To Open File.")
Else
Dim FileWatch As System.IO.FileSystemWatcher
FileWatch = New System.IO.FileSystemWatcher(FilePath, FileName)
FileWatch.WaitForChanged(IO.WatcherChangeTypes.Changed,5000)
End If
FileOpen = False
End Try
Loop While Not FileOpen
If FileOpen Then
File.Write(Data, 0, Data.Length)
File.Close()
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
不确定标准类是否确实可以引发事件,但我在最近所做的一些工作中很容易遇到类似的问题。
简而言之,我试图写入当时锁定的文件。我最终将写入方法包装起来,以便它会在几毫秒后自动尝试再次写入。
大声思考,你能探测文件的只读状态吗?那么可能值得拥有一个文件 IO 包装器,它可以为挂起的文件操作或其他东西堆叠委托。有什么想法吗?