2012-09-19 28 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