2012-09-19 63 views
0

這是一個winforms vb.net應用程序。由於一些限制,我無法使用VS中提供的內置clickOnce更新。所以爲了處理我的應用程序的更新,我寫了一個更新應用程序。下載電子郵件附件並對其進行處理。所有的工作都很好,包括從應用程序安裝文件夾中刪除舊文件,然後將更新的文件移動到該文件夾​​。用vb刪除文件,然後複製替換文件仍舊作爲舊文件

但新文件似乎對應用程序根本沒有任何影響。僅用於測試,我在應用程序的「表單加載」事件中放置了一個MessageBox.Show。當我調試時,該應用程序顯示VS中的消息框。以及當我從bin文件夾運行應用程序時。當我的更新程序應用程序複製文件在那裏,但沒有骰子沒有更改,沒有消息框顯示應用程序加載時。進一步調查問題我手動刪除了應用程序文件夾中要替換的文件,然後將更新zip文件的內容解壓縮到該文件夾​​中。已啓動應用程序和現在的消息框顯示..如果我將文件複製到應用程序直接從bin文件夾到它顯示的應用程序文件夾。

這使我相信在下面的函數背後有一些事情我不在捕捉。任何想法,爲什麼這是失敗?

 Function ApplyUpdates(ByVal c As Integer, ByVal e As List(Of MessagePart)) 
    Dim xxxxState As Boolean = False 
    Dim _path As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles\" 
    Dim d As Integer = 20 

    xxxxState = isProcessRunning("xxxx") 
    If xxxxState = True Then 
     KillxxxxTask() 
    End If 

    For Each _S In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "XXXX\UpdateFiles") 
     System.IO.File.Delete(_S) 
    Next 


    For Each att In e 
     Dim y As Boolean = UnZip(att.FileName) 
    Next 

    For Each f In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles") 
     Dim y As String = Path.GetExtension(f) 
     Dim _fNM As String = Path.GetFileNameWithoutExtension(f) 
     If y.Contains("ex0") Then 
      My.Computer.FileSystem.RenameFile(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles" + "\" + _fNM + y, _fNM + "." + "exe") 
      f = f.Replace("ex0", "exe") 
     End If 
     If y.Contains("dl0") Then 
      My.Computer.FileSystem.RenameFile(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles" + "\" + _fNM + y, _fNM + "." + "dll") 
      f = f.Replace("dl0", "dll") 
     End If 
     updating(d, "Copying File : " + f) 
     d += 10 
     Dim fName As String = Path.GetFileName(f) 
    Next 

     For Each S In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles") 
      Dim _ofile As String = Path.GetFileName(S) 
      If File.Exists("C:\XXXX\" + _ofile) Then 
       File.Delete("C:\XXXX\" + _ofile) 
      End If 
      ' File.Copy(S, "C:\XXXX\" + _ofile, True) 

     Next 
     For Each S In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles") 
      Dim _ofile As String = Path.GetFileName(S) 
      File.Move(S, "C:\XXXX\" + _ofile) 

     Next 
     updating(100, "Update Completed") 

    Return Nothing 
End Function 
+0

您是否在刪除文件之前關閉應用程序,並在複製完成後重新啓動它?那是什麼killtask()呢? –

+0

是的,這就是Killtask()..更新程序檢查應用程序是否正在運行。然後,如果它在執行更新之前終止了任務.. – Skindeep2366

+0

我假設你在VS調試器下運行了更新程序,在頂部有一個斷點,並且驗證了每行代碼都可以達到您的預期目標嗎? –

回答

2

這聽起來一個可怕很像Windows文件虛擬化。

搜索C:\Documents and Settings\<userName>\Application Data和子文件夾中的文件,我懷疑你會在那裏找到它們。

如果您的項目中沒有包含app.manifest,Windows會自行保護您的程序。 Windows會假設你的應用程序是一箇舊的,遺留的應用程序,除非它有一個app.manifest,否則它不是UAC。爲了防止應用程序從拒絕的文件訪問中崩潰,它允許執行文件操作,但是會偷偷將文件操作映射到安全的本地文件夾。

只需添加一個app.Manifest:項目添加 - >新建項目 - >應用程序清單文件

應該這樣做。您可能會發現需要請求提升權限,但詳細信息都在app.manifest文件中。

有關文件虛擬化的詳細信息,請參閱this explanation。這是一篇大文章,但如果您按Ctrl-Find'虛擬化過程',它會將您帶到相關部分。

有關app.manifest的更多詳細信息,請參閱This MSDN article

+0

這幾乎是我在OP上發表的最後一篇評論時得到的結果,這讓我之前感到困惑。 –

+0

這是一些有點事情......原來我在錯誤的地方有一個刪除方法。我得到這個後,我擺脫了提升的權限問題,現在一切運作良好。非常感謝。 – Skindeep2366