c# - 当文件变得可访问时是否可以引发事件?

标签 c# .net file-io

在 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

关于c# - 当文件变得可访问时是否可以引发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24315/

相关文章:

.net - 使用简单注入(inject)器的 ASP.NET Core Web API 服务的正确 DefaultScopedLifestyle 是什么?

c - 如何从文本文件中读取最小/最大变量?

c# - 将托管控制托管为 CWnd 时应用程序挂起

c# - 使用MemoryBarrier传播Dictionary <int,T>多线程应用程序中的更改

c# - Mono 上的 SignalR 和 Websockets

c# - .net 应用程序 CPU 使用率高

c - 文件操作写入不会在新行中发生

python - 导入 txt 文件并将每一行作为列表

c# - 对多个 ControlCollection 进行 Foreach

c# - 当新建一个表单时,我会得到一个进程还是线程?