2009-01-12 64 views
3

我有這樣的:如何在文件操作完成之前延遲vb.net程序?

Dim myTemp As String 
    myTemp = System.DateTime.Now().ToString("MMMddyyyy_HHmmss") & ".pdf" 

    System.IO.File.Copy(myFile, "c:\" & myTemp) 
    Application.DoEvents() 
    OpenFile(myTemp) 

的問題是,當我打電話的OpenFile,這僅僅是打開一個文件子打電話,就無法找到該文件。這是因爲它調用得太快以至於程序沒有時間在打開之前真正創建文件。

我認爲DoEvents()會糾正這一點,但事實並非如此。我需要等到文件創建完成後再打開文件。我怎樣才能做到這一點?

回答

3

我不是很瞭解VB.NET,但不是複製阻塞呼叫?你確定你不只是試圖從錯誤的位置打開文件(或者未轉義的反斜槓使路徑無效)?

這是怎麼回事?我已經將驅動器號添加到了OpenFile中,並將這兩個地方的反斜槓都轉義了出來。

Dim myTemp As String 
myTemp = System.DateTime.Now().ToString("MMMddyyyy_HHmmss") & ".pdf" 

System.IO.File.Copy(myFile, "c:\\" & myTemp) 
OpenFile("c:\\" & myTemp) 
-1

System.Threading.Thread.Sleep(1000);

0

這是一個有點哈克,但它應該工作。

Do Until (System.IO.File.Exists("C:\" & myTemp)) 
    Threading.Thread.Sleep(1) 
Loop 
+0

我不」想如果文件需要一段時間才能複製這將工作。 – JohnFx 2009-01-12 23:23:07

+0

副本是阻塞呼叫,他得到的問題是阻塞呼叫釋放和下一個代碼步驟之間的處理時間。這一點代碼只是幫助操作系統趕上。 – 2009-01-12 23:24:02

+0

這聽起來有點腥。如果它阻塞,它應該在控制返回到調用模塊時完成操作。你是否認爲OS可能沒有足夠快地釋放文件上的鎖? – JohnFx 2009-01-12 23:27:03

0

這不是真的Doevents用於什麼。它最常用於讓UI消息隊列清除(讓UI有一些CPU時間刷新)。它比我所描述的稍微複雜一些,但這不是你問題的關鍵,所以我將繼續前進。

試試這個讓你的代碼塊的關鍵部分:

SyncLock Me 
    System.IO.File.Copy(myFile, "c:\" & myTemp) 
    Application.DoEvents() 
End SyncLock 

OpenFile(myTemp) 
+0

順便說一句:來自MSDN的Application.DoEvents描述是「處理當前在消息隊列中的所有Windows消息」。 消息隊列是Windows允許輸入在進入UI(鼠標/鍵盤事件等)之前排隊等待的一種方式。您的代碼會「阻止」或暫時停止該行。 – JohnFx 2009-01-12 23:31:49

1

理想情況下,你應該在單獨的線程當它這樣做它就可以執行打開,通知主界面線程執行復制通過調用調用。

0

除了湯姆的回答,不是最好放一個Application.DoEvents()而不是讓線程睡覺?

0

首先,你不應該在任何地方調用DoEvents。大多數情況下,當它被使用時,繞過什麼應該是異步操作是一種破解。

這就是說,Copy方法是一個同步操作。撥打OpenFile將不會發生,直到撥打Copy完成。

這就是說,當OpenFile的調用發生時,如果文件不存在,這是因爲您將其複製到了錯誤的地方,或者是因爲其他進程正在處理有問題的文件。

0

我thinf SYNCLOCK不利於這種情況下

的交代,MSDN可以幫我

的的SyncLock語句確保多個線程不會在同一時間執行相同的語句。當線程到達SyncLock塊時,它會評估表達式並保持這種排他性,直到它對由表達式返回的對象鎖定爲止。這可以防止表達式在運行多個線程期間更改值,這可能會給您的代碼帶來意想不到的結果。

在我看來,複製阻塞的方法,所以線程等待,直到完成了複製

`噸是問題的另一個地方?

0
dim SourceFile as string 
dim DestinationFile as string 

SourceFile = "c:/archivo.txt" 
DestinationFile = "c:/destino/archivo.txt" 

If System.IO.File.Exists(SourceFile) = True Then 

    System.IO.File.Copy(SourceFile, DestinationFile, True) 
    'or 
    'My.Computer.FileSystem.CopyFile(SourceFile, DestinationFile, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing) 

    SourceFile = "" 
    DestinationFile = "" 

else 

    MessageBox.Show("the file don't copy!") 

end if 
1

這是醜陋的,但它爲我工作

Function WaitForFile(fullPath, wdelay) 
    Dim vd_start As Date 
    vd_start = Now() 
    Dim vd_end As Date 
    Dim wsec, wmin, whour, wt5string As Integer 
    Dim wtstring As String 
    Dim count As Integer 
    Dim wscale As Integer 
    Dim vd_1 As Date 
    Dim Vo_fileinfo As FileInfo 

    Dim fs As FileStream 

    wsec = Format(wdelay Mod 60, "00") 
    wmin = Format(Int(wdelay/60), "00") 
    whour = Format(Int(wdelay/(60 * 60)), "00") 
    wtstring = CStr(whour) + ":" + CStr(wmin) + ":" + CStr(wsec) 
    Dim duration = New System.TimeSpan(0, whour, wmin, wsec) 
    vd_end = vd_start.Add(duration) 

    On Error GoTo error1 
    Dim vsize1, vsize2 As Long 
    While vd_start < vd_end 
     fs = New FileStream(fullPath, FileMode.Open) 
     fs.ReadByte() 
     fs.Seek(0, SeekOrigin.Begin) 
     fs.Close() 
     Vo_fileinfo = New FileInfo(fullPath) 
     vsize1 = Vo_fileinfo.Length 
     Threading.Thread.Sleep(500) 
     Vo_fileinfo = New FileInfo(fullPath) 
     vsize2 = Vo_fileinfo.Length 
     If vsize1 <> vsize2 Then GoTo error1 
     GoTo finalgoto 
error1: 
     Err.Clear() 
     vd_start = Now() 
    End While 

    WaitForFile = False 
    GoTo Endgoto 
finalgoto: WaitForFile = True 
Endgoto: 
End Function 
相關問題