使用vb删除然后复制的替换文件仍然充当旧文件

时间:2012-09-19 22:30:19

标签: vb.net winforms

这是一个winforms vb.net应用程序。由于某些限制,我无法使用VS中提供的内置clickOnce更新。因此,为了处理我的应用程序的更新,我写了一个更新应用程序下载电子邮件附件并对其进行处理。所有工作都非常有效,包括从应用程序安装文件夹中删除旧文件,然后将更新的文件移动到该文件夹​​。

但新文件似乎对应用程序没有任何影响。仅仅为了测试我在应用程序Form Load事件中放置了一个MessageBox.Show ..当我调试时,应用程序在VS中显示消息框。以及当我从bin文件夹运行应用程序时..当我的更新程序应用程序执行复制时,文件就在那里,但没有任何骰子没有更改,并且应用程序加载时没有显示消息框。进一步调查问题我手动删除了应用程序文件夹中要替换的文件,然后将更新zip文件的内容解压缩到该文件夹​​。启动App,现在显示一个消息框..如果我复制文件为应用程序直接从bin文件夹到它显示的app文件夹。

这让我相信在下面这个函数的背后会发生一些我没有抓到的东西。任何想法为什么失败???

     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

1 个答案:

答案 0 :(得分:2)

这听起来很糟糕很像Windows文件虚拟化。

C:\Documents and Settings\<userName>\Application Data和子文件夹中搜索文件,我怀疑你会在那里找到它们。

如果您的项目中没有包含app.manifest,Windows会执行此操作来保护您的程序。 Windows将假设您的应用程序是一个旧的遗留应用程序,除非它有app.manifest,否则不会识别UAC。为了防止应用程序因拒绝文件访问而崩溃,它允许执行文件操作,而是秘密地将文件操作映射到安全的本地文件夹。

只需添加app.Manifest:Project Add - &gt;新商品 - &gt;应用程序清单文件

应该这样做。您可能会发现需要提升权限,但详细信息都在app.manifest文件中。

有关文件虚拟化的详细信息,请查看this explanation。这是一篇很重要的文章,但是如果您按住Ctrl键查找“虚拟化过程”,它将带您进入相关部分。

有关app.manifest的详细信息,请参阅This MSDN article