2016-08-17 3 views
0

私は、間違った方法で問題に取り掛かったと思います。私はUSBドライブにファイルをコピーするための信頼できる進捗バーを取得しようとしています。私の問題は、私のアプローチでは、それは動作しますが、信頼できないことは、ファイル作成イベントがファイルの書き込みが完了する前にトリガされるので、必要な情報を表示することです(ディレクトリコピーの場合はマルチ処理され、すぐしかしusbのdirveが遅い(USB 2.0)で遠く長い場合は特にために記述します。以下は、私のアプローチがあるが、私はこの問題を解決するためのより良い方法がなければならないと確信している。ディレクトリのコピー(サブディレクトリを含む)の進捗バー

Public counterLocalFiles As String 
Private Sub CopyUSB 
     fsw_USB = New IO.FileSystemWatcher(Path) 
     fsw_USB.IncludeSubdirectories = True 
     fsw_USB.EnableRaisingEvents = True 
     UpdateProgressBarMaximum2(CInt(counterLocalFiles)) 
     counterLocalFiles = System.IO.Directory.GetFiles(SourcePath, 
     My.Computer.FileSystem.CopyDirectory(SourcePath, Path)"*.jpg*", SearchOption.AllDirectories).Length  
End Sub 

Private Sub fsw_USB_Created(sender As Object, e As FileSystemEventArgs) Handles fsw_USB.Created 
     Dim counterUSBFiles = IO.Directory.GetFiles(Path, "*.jpg", SearchOption.AllDirectories).Length 
     UpdateProgressBar2(CInt(counterUSBFiles)) 
     UpdateLabelText2(CStr(counterUSBFiles) & " von " & CStr(counterLocalFiles)) 
End Sub 

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

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

あなたがのためのUIオプションが存在しているはず...必要な修正CopyDirectoryプロセス? 'UIOption.AllDialogs'を使って' FileSystem.CopyDirectory(sourcePath、destinationPath、 UIOption.AllDialogs) 'はウィンドウコピーの進行状況ダイアログを表示します。 –

+0

実際に私はそれを知っていませんでした、私はちょっとでもそれを暗示したいと思います。私は一度に複数のファイルコピーを作成するので(バックグラウンドワーカーには2〜3人)、一度にすべてのファイルコピーを見るほうが簡単です。しかし、私はおそらくquickar workurouindのおかげで:) – Alex

+0

より多くのコントロールとより正確なコピープロセスを望むなら、 'FileSystemWatcher'なしでそれを行う方法がありますが、もっと複雑です。 'CopyDirectory'を実行する代わりに、あなたが行くごとにディレクトリを個別に作成する各ファイルをコピーします。さらに正確にするためには、filesize、コピーする各ファイルのバイトを読み書きするために 'FileStream'を使用してコピーが必要なすべてのリストを取得し、進行状況を更新することができます。バックグラウンドワーカーと一緒にUIを更新しました。 –

答えて

1

私が作成しましたとFileStreamを使用して行う方法の例です。コードはVisual Studioプロジェクトのためここに投稿できます...それで、私はそれを圧縮して、ここでダウンロードできます:http://www.filedropper.com/copydirectoryvisualstudioexample

これを実行して、[ソース]フォルダと[宛先]フォルダを選択できます。

メインディレクトリのコピー処理がbgwDirectoryCopy_DoWorkで発生し、個々のファイルのコピー処理がcopyFileWithProgress

で起こるだけで、しかし、あなたが今、それをコピー*.*

+0

btwを見れば、Filestreamの使用方法はかなりわかりませんが、Filesystem.CopyDirectoryとして信頼できるFileStream jusstですか?何かがうまくいかない場合、Filecopyと同じようにスローされますか? – Alex

+0

はい、ファイルをコピーしているときにスローされた例外をキャッチして処理します –

関連する問題