2016-08-15 4 views
0

ファイルをローカルコンピュータからネットワークデバイスにコピーしようとしています。私は、ファイルコピーのために働いてプログレスバーを取得しようとしている、そしてそれはなしサブディレクトリに単一ディレクトリのために働いてしまった:サブディレクトリの進行状況バーにFilewatcherを使用すると、正しく更新されない

Private Sub CopyPictures() 
    Try       
    If Not Directory.Exists(DestinationPath) Then 
      My.Computer.FileSystem.CreateDirectory(DestinationPath) 
    End If 
      Dim counterLocalFiles = My.Computer.FileSystem.GetFiles(SourcePath) 
      UpdateProgressBarMaximum1(CInt(counterLocalFiles.Count)) 
      UpdateLabelText2(CStr(counterLocalFiles.Count)) 'is a label which shows copied X files of Label2 Files 

      fsw1 = New IO.FileSystemWatcher(DestinationPath) 
      fsw1.EnableRaisingEvents = True 

      My.Computer.FileSystem.CopyDirectory(SourcePath, DestinationPath) 

      GetSettingsFromFile()    
    Catch Exec As System.IO.IOException 
     Dim dr As DialogResult = MessageBox.Show("Some Random Error Code", "Exception Title", MessageBoxButtons.OKCancel) 
     If (Not DialogResult.OK = dr) Then 
      Exit Sub 
     Return 
End If 
    End Try 
End Sub 

Private Sub fsw1_Created(sender As Object, e As FileSystemEventArgs) Handles fsw1.Created 
    Dim counterRemoteFiles = My.Computer.FileSystem.GetFiles(DestinationPath) 
    UpdateProgressBar1(CInt(counterRemoteFiles.Count)) 
    UpdateLabelText1(CStr(counterRemoteFiles.Count)) 
End Sub 

更新ObjectX潜水CopyPicturesはBackgroundWorkerので提起されているので、単に関数を呼び出しをしています同様に、このコードは私のために完全に正常に動作

Private Sub UpdateProgressBar1(Value As Int32) 
    If ProgressBar1.InvokeRequired Then 
     ProgressBar1.Invoke(New Action(Of Integer)(AddressOf UpdateProgressBar1), Value) 
    Else 
     'We are on the UI thread so update the control. 
     ProgressBar1.Value = Value 
    End If 
End Sub 

例えば、この1のように、すべてを見て、私はそう私はそれらを事前カント画像を含むサブディレクトリ、および潜水艦の名前に対処する必要がランダムであります私はわずかな変更を思いついた:

カウンタはこのように今探しています:

Dim counterLocalFiles = System.IO.Directory.GetFiles(SourcePath, "*.jpg*", SearchOption.AllDirectories).Length 
      UpdateProgressBarMaximum1(CInt(counterLocalFiles)) 
      UpdateLabelText2(CStr(counterLocalFiles)) 

そして、この:

Dim counterRemoteFiles = IO.Directory.GetFiles(DestinationPath, "*.jpg", SearchOption.AllDirectories).Length 
    UpdateProgressBar1(CInt(counterRemoteFiles)) 
    UpdateLabelText1(CStr(counterRemoteFiles)) 

そして、私が追加:

fsw1.IncludeSubdirectories = True 

今すぐweired問題が開始しました:これは、ファイルを正しくカウントしますソースディレクトリのlabel2をすべてのサブディレクトリ内の正しいファイル量に設定し、コピーを開始します。リアルタイムではProgressbarは更新されません。それは最初のディレクトリで完了したときにそれを一度更新し、それに含まれるファイルの量を追加するだけでした。その後、それは完全に停止して2番目のディレクトリを特定し、それをプログレスバーに全く追加しませんでした。私はここで間違って何をしていますか?私は私の英語がうまくいくことを願っています。何か質問がある場合、または私が十分に明確でない場合は、私に知らせてください。ありがとう

答えて

1

ファイルシステムウォッチャーがインスタンス化されたときに、プログレスバー更新ルーチンをトリガーするイベントコンシューマーは一度も呼び出されません。

コピーイベントを処理し、進行状況の更新コードを発生させるイベントを宣言する必要があります。 Filesystemwatcherはネットワークドライブを監視できないため、counterRemoteFilesのカウントが増加すると進捗状況の更新メソッドを起動するイベントを宣言することができます。

+0

しかし、私はサブディレクトリなしでコードを使用すると、それは正常に正常に動作しますか?これは完全に同じように動作しますが、サブディレクトリをカウンターのための控除にすることはありません。 – Alex

+0

私はあなたの変数を見ることができるラインごとのデバッグを提案します...これは非常に役立つでしょう。 VSで作業している場合は、右クリックしてコード内にブレークポイントを設定し、「デバッグを開始」モードでコードを実行すると、ブレークポイントで実行を停止し、そこからステップできるようになります。 F10)、コードにステップインします(F11)。踏み越えながら、変数やオブジェクトを浮かべて、その値や状態を見ることができます。 varsを右クリックし、デバッグモードで表示するために「監視」アイテムとして追加することができます。 – DukeDidntNukeEm

+0

そして、私は// foo/barにある設定ファイルの変更を監視するために、プログラムのどこか他の場所にsystemfilewatcherを使用しています。私はVBで初めてです。ネットでは、私は何かfundamerlyここで間違っているかもしれないが、私はそれを参照してください。 – Alex

0

は、私はちょうど私がフォームエディタでこれをtrueに設定する代わりに、コードでそれをやっていた正しく

fsw1.IncludeSubdirectories = True 

を置くことでミスを犯し判明します。一度私は実際にそれをコードに入れてfswを初期化した後、それはうまくいくでしょう

関連する問題