0

Visual Basic 2010 でプログラムを作成しました。これは、フォルダー内の変更を監視して書き留めるプログラムです。ファイルが削除されたとき、ファイルの名前が変更されたとき、ファイルが作成されたとき、およびどのファイルが、それは問題です。別の変更が行われたときに新しい行を作成するコードを作成しました。変更が行われると、log.txt という名前のファイルに書き留められますが、ログは「ファイル log.txt が変更されました」のようにしか見えません。プログラムは、変更をログに書き込むときに log.txt を変更してログを書き留めますが、奇妙なことに、ドキュメント内のすべてを削除し、「ファイル log..txt が変更されました」と書き込みます。書く前に新しい行を作るコードを書いています。誰かがこの問題で私を助けることができますか? コードは次のとおりです。

Imports System.IO
Imports System.Diagnostics
Public Class Form1
Public watchfolder As FileSystemWatcher

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    watchfolder = New System.IO.FileSystemWatcher()

    'this is the path we want to monitor
    watchfolder.Path = TextBox1.Text

    'Add a list of Filter we want to specify
    'make sure you use OR for each Filter as we need to
    'all of those 

    watchfolder.NotifyFilter = IO.NotifyFilters.DirectoryName
    watchfolder.NotifyFilter = watchfolder.NotifyFilter Or _
                               IO.NotifyFilters.FileName
    watchfolder.NotifyFilter = watchfolder.NotifyFilter Or _
                               IO.NotifyFilters.Attributes

    ' add the handler to each event
    AddHandler watchfolder.Changed, AddressOf logchange
    AddHandler watchfolder.Created, AddressOf logchange
    AddHandler watchfolder.Deleted, AddressOf logchange

    ' add the rename handler as the signature is different
    AddHandler watchfolder.Renamed, AddressOf logrename

    'Set this property to true to start watching
    watchfolder.EnableRaisingEvents = True

    Button1.Enabled = False
    Button2.Enabled = True

    'End of code for btn_start_click
End Sub
Private Sub logchange(ByVal source As Object, ByVal e As  _
                    System.IO.FileSystemEventArgs)
    If e.ChangeType = IO.WatcherChangeTypes.Changed Then
        Dim writer As New IO.StreamWriter("log.txt")
        writer.WriteLine(Chr(13) & "File" + " " + e.FullPath + " " + "has been modified")
        writer.Close()
    End If
    If e.ChangeType = IO.WatcherChangeTypes.Created Then
        Dim writer As New IO.StreamWriter("log.txt")
        writer.WriteLine(Chr(13) & "File" + " " + e.FullPath + " " + "has been created")
        writer.Close()
    End If
    If e.ChangeType = IO.WatcherChangeTypes.Deleted Then
        Dim writer As New IO.StreamWriter("log.txt")
        writer.WriteLine(Chr(13) & "Filde" + " " + e.FullPath + " " + "has been deleted")
        writer.Close()
    End If
End Sub
Public Sub logrename(ByVal source As Object, ByVal e As  _
                        System.IO.RenamedEventArgs)
    Dim writer As New IO.StreamWriter("log.txt")
    writer.WriteLine(Chr(13) & "File" + " " + e.FullPath + "has been renamed to" + " " + e.Name)
    writer.Close()
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    ' Stop watching the folder
    watchfolder.EnableRaisingEvents = False
    Button1.Enabled = True
    Button2.Enabled = False
End Sub

End Class
4

2 に答える 2

1

ストリームライターを開くと、追加するように指示されていないため、上書きされます。

Dim writer As New IO.StreamWriter("log.txt", True)

また、アクティビティごとに新しいストリームは必要ありません。

Dim msg as string= Environment.NewLine & "File " & e.FullPath & " "
Select case e.ChangeType
      case IO.WatcherChangeTypes.Created 
         msg &= "has been created"

      case IO.WatcherChangeTypes.Deleted
         msg &= "has been deleted"
      ...etc
 End Select

 Dim writer As New IO.StreamWriter("log.txt", True)
 writer.WriteLine(msg)
 writer.Close()

..ウォッチャーが終了するまでストリームを開いたままにしておくこともできます

おそらく log.txt へのロギングの変更を除外する必要があるため、次のようにテストしe.FullPathます。

 If System.Io.Path.GetFileName(e.FullPath).ToLower = "log.text" Then Exit Sub
于 2013-10-16T16:27:36.827 に答える
0

プログラムが動作するようになりました!MPelletier と Plutonix の素晴らしいサポートに感謝します! 完全なコードは次のとおりです。

 Imports System.IO
 Imports System.Diagnostics
 Public Class Form1

Public watchfolder As FileSystemWatcher

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    watchfolder = New System.IO.FileSystemWatcher()
    watchfolder.IncludeSubdirectories = True

    watchfolder.Path = TextBox1.Text



    watchfolder.NotifyFilter = IO.NotifyFilters.DirectoryName
    watchfolder.NotifyFilter = watchfolder.NotifyFilter Or _
                               IO.NotifyFilters.FileName
    watchfolder.NotifyFilter = watchfolder.NotifyFilter Or _
                               IO.NotifyFilters.Attributes


    AddHandler watchfolder.Changed, AddressOf logchange
    AddHandler watchfolder.Created, AddressOf logchange
    AddHandler watchfolder.Deleted, AddressOf logchange


    AddHandler watchfolder.Renamed, AddressOf logrename


    watchfolder.EnableRaisingEvents = True

    Button1.Enabled = False
    Button2.Enabled = True


End Sub
Private Sub logchange(ByVal source As Object, ByVal e As  _
                    System.IO.FileSystemEventArgs)
    If System.IO.Path.GetFileName(e.FullPath).ToLower = "log.txt" Then Exit Sub
    Dim msg As String = Environment.NewLine & "File " & e.FullPath & " "

    Select Case e.ChangeType
        Case IO.WatcherChangeTypes.Created
            msg &= "has been created" + "  " + "Time:" + " " + Format(TimeOfDay)

        Case IO.WatcherChangeTypes.Deleted
            msg &= "has been deleted" + "  " + "Time:" + " " + Format(TimeOfDay)

        Case IO.WatcherChangeTypes.Changed
            msg &= "has been modified" + "  " + "Time:" + " " + Format(TimeOfDay)

    End Select

    Dim writer As New IO.StreamWriter("log.txt", True)
    writer.WriteLine(msg)
    writer.Close()
End Sub
Public Sub logrename(ByVal source As Object, ByVal e As  _
                        System.IO.RenamedEventArgs)
    Select e.ChangeType
        Case IO.WatcherChangeTypes.Created
            Exit Sub
        Case IO.WatcherChangeTypes.Changed
            Exit Sub
        Case IO.WatcherChangeTypes.Deleted
            Exit Sub
        Case Else
            Dim msgrn As String = Environment.NewLine & "File " + e.OldName + " "
            msgrn &= "has been renamed to" + " " + e.Name + "  " + "Time:" + " " + Format(TimeOfDay)
            Dim writer As New IO.StreamWriter("log.txt", True)
            writer.WriteLine(msgrn)
            writer.Close()
    End Select

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

    watchfolder.EnableRaisingEvents = False
    Button1.Enabled = True
    Button2.Enabled = False
End Sub

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    Me.Hide()
    MsgBox("To close it later, don't open the program again, press CTRL+ALT+DELETE and press Start Task Manager or something like that, and go to processes and kill FolderMonitor.exe or what you have named the file", 0 + 64, "FolderMonitor")
End Sub
End Class
于 2013-10-17T13:35:34.597 に答える