0

次のコードは、ファイルがまだ存在しない限り、ファイルを移動しています。その場合、ファイルは移動されません。

私の質問は に関するものFile.Moveです。メッセージボックスはいつ表示されますか? File.Moveファイルが完全に移動されると表示されますか、それとも行が実行された直後に表示されますか。

ファイルのサイズによっては、ファイルの移動に時間がかかる場合があるため、ファイルが完全に移動されるまでメッセージボックスを表示したくありません。

これを行うより良い方法はありますか?

        For Each foundFile As String In My.Computer.FileSystem.GetFiles("C:\Temp\", FileIO.SearchOption.SearchAllSubDirectories, "*.zip")
            Dim foundFileInfo As New System.IO.FileInfo(foundFile)

            If My.Computer.FileSystem.FileExists("C:\Transfer\" & foundFileInfo.Name) Then
                Msgbox("File already exists and will not moved!")
                Exit Sub
            Else
                File.Move(foundFile, "C:\Transfer\" & foundFileInfo.Name)
                Msgbox("File has been moved!")
            End If
        Next
4

5 に答える 5

5

このソースによると、File.Move呼び出しは同期的です。つまり、ファイルのサイズに関係なく、ファイルが移動された後にのみ msgbox が表示されます。

完全を期すために、UI をブロックしたくない場合は、次のようなことを試すことができます。

' This must be placed outside your sub/function
Delegate Sub MoveDelegate(iSrc As String, iDest As String)

' This line and the following go inside your sub/function
Dim f As MoveDelegate = AddressOf File.Move

' Call File.Move asynchronously
f.BeginInvoke(
    foundFile, 
    "C:\Transfer\" & foundFile, 
    New AsyncCallback(Sub(r As IAsyncResult)
                          ' this code is executed when the move is complete
                          MsgBox("File has been moved!")
                      End Sub), Nothing)

または、新しいasync / await命令を調べることができます。

于 2012-10-18T17:35:52.723 に答える
3

File.Moveは同期操作であるため、移動が完了するまで、アプリケーションは次のコード行(メッセージボックス)を実行しません。

ご指摘のとおり、ファイルが大きい場合(およびドライブ間を移動している場合)、ファイルの移動が完了するまでメッセージボックスは表示されません。この間、GUIが応答しないように見えるため、ユーザーエクスペリエンスが低下する可能性があります。

時間をかけて、バックグラウンドスレッドまたは非同期/待機呼び出しを利用してバックグラウンドで操作を実行する方法を学ぶことをお勧めします。

MSDNに非同期IOに関する優れた記事があります:http: //msdn.microsoft.com/en-us/library/kztecsys.aspx

最後に、FileSystemオブジェクトのMoveFileメソッドを使用することもできます。これにより、UIの応答性を維持することだけが心配な場合は、ファイル移動UIをポップアップ表示できます。

FileSystem.MoveFile(sourceFileName, destinationFileName, UIOption.AllDialogs)
于 2012-10-18T17:35:58.190 に答える
2

残念ながら、コードは次から次へと実行されるためMsgbox、ファイルが完全に移動されている限りポップアップが表示されます。

進行状況を監視する場合は、このリンクにアクセスして詳細を確認してください

于 2012-10-18T17:34:50.847 に答える
2

メッセージ ボックスは、ファイル サイズに関係なく、ファイルが完全に移動された後に表示されます。

于 2012-10-18T17:35:56.193 に答える
1

メソッドが非同期でない限り、コードの行は常に次の行に進む前に実行を終了します。

ファイルの移動が遅く、プログラムを保持していることが悪いことである場合は、たとえばを使用してバックグラウンドスレッドで移動を行うことができますBackgroundWorker

于 2012-10-18T17:37:18.120 に答える