2012-10-18 61 views
0

只要文件不存在,以下代碼就會移動文件。如果有,它不會移動文件。在執行下一行代碼之前是否會執行一行代碼?

我的問題是關於File.Move。 msgbox何時會顯示?一旦文件完全移動,它會顯示,還是會在File.Move行執行後立即顯示。

根據文件大小,移動文件可能需要一段時間,因此我不希望msgbox顯示,直到文件完全移動。

有沒有更好的方法來做到這一點?

 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 
+1

好吧,我有一種感覺它會完成,但想在運行代碼行之前確定。 – Muhnamana

回答

5

對應於this sourceFile.Move調用是同步的,這意味着msgbox只有在文件被移動後纔會顯示,無論其大小如何。

爲了完整起見,如果你不想阻止用戶界面,你可以嘗試這樣的事:

' 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指令。

2

不幸的是,該代碼後,其他執行行這樣Msgbox將只要該文件已被完全移動彈出。

如果你想監視進度,visit this link for more details

2

文件完全移動後將顯示消息框,與文件大小無關。

3

File.Move是一個同步操作,所以在移動完成之前,應用程序不會執行下一行代碼(您的messagebox)。

如您所示,如果文件很大(並且正在移動驅動器),則在文件移動完成之前,消息框纔會顯示出來。這可能會導致糟糕的用戶體驗,因爲在此期間,GUI看起來沒有響應。

我會建議花時間學習如何利用後臺線程或異步/等待調用來在後臺執行操作。

有異步IO的好文章在MSDN:http://msdn.microsoft.com/en-us/library/kztecsys.aspx

最後,您還可以使用文件系統對象的MoveFile方法,它可以彈出一個文件移動UI給你,如果你只是擔心讓你的UI響應:

FileSystem.MoveFile(sourceFileName, destinationFileName, UIOption.AllDialogs) 
1

除非方法是異步的,否則在繼續下一行之前,一行代碼將始終完成執行。

請注意,如果文件移動緩慢,並且它阻止您的程序是一件壞事,那麼您可以在後臺線程中使用例如BackgroundWorker進行移動。