1

我的程序在 windows 系统路径 (C:\windows\syswow64...) 处写入一些文件。

其中一个文件因测试原因被删除,我们正在更改某些内容,我们需要将其删除。好的,这里没有问题,文件不见了(几乎......)。问题是,我的应用程序仍在获取文件!这很有趣,因为我真的删除了文件(shift+del)

我用 FileInfo 类测试文件是否存在。

我要疯了。我看不出哪里错了。当然,在文件夹选项中启用以查看隐藏和系统文件...

谢谢

我的代码如下:

Public Shared Function GetUserConfigFile() As String
    Dim UserConfigFile As String = Metodos.GetUserConfigPath("config.gf")
    'Above we have C:\Windows\SysWOW64\Microsoft\....\config.gf

    Dim ConfigFile As New IO.FileInfo(UserConfigFile)
    ConfigFile.Refresh()

    EventLog.RegisterDebugMessage("ConfigFile.Exists:{0};ConfigFile.Length:{1}", ConfigFile.Exists, ConfigFile.Length)
    If ((ConfigFile.Exists AndAlso ConfigFile.Length = 0) OrElse Not ConfigFile.Exists) Then
        Dim config As StreamWriter = IO.File.CreateText(UserConfigFile)
        config.WriteLine("<?xml version=""1.0""?><cnfg></cnfg> ")
        config.Close()
        config.Dispose()
    End If
    EventLog.RegisterDebugMessage("config.gf -> {0}", IO.File.ReadAllText(UserConfigFile))
    '''''''''''And here it's show me the content of the file... -.-''''''

    Return UserConfigFile
End Function
4

2 回答 2

2

在与 Mark Peters 所说的非常相似的注释中,可能发生的另一件事是UAC 数据重定向,因为您没有对该文件夹的写入权限,因此您真正看到的是位于%LOCALAPPDATA%\VirtualStore\Windows\System32. 您的应用程序是否以管理权限运行,如果没有,文件是否会丢失?

我在Super User上有一篇更长的文章描述了类似的问题。

顺便说一句,为什么您“需要”让您的程序访问 windows 目录中的文件?您在做什么将要求添加到您的程序中?

于 2012-08-08T15:19:49.883 回答
2

我猜你被文件系统重定向器(MSDN)击中

在大多数情况下,每当 32 位应用程序尝试访问 %windir%\System32 时,访问都会重定向到 %windir%\SysWOW64。对 %windir%\lastgood\system32 的访问被重定向到 %windir%\lastgood\SysWOW64。对 %windir%\regedit.exe 的访问被重定向到 %windir%\SysWOW64\regedit.exe。

System32 和 SYSWOW64 文件夹有一些神奇之处。(讽刺的是,32位文件存储在WOW64中,64位文件存储在System32中)

MSDN 页面提出了一个可行的解决方案:

32 位应用程序可以通过将 %windir%\Sysnative 替换为 %windir%\System32 来访问本机系统目录。WOW64 将 Sysnative 识别为用于指示文件系统不应重定向访问的特殊别名。这种机制灵活且易于使用,因此,建议使用绕过文件系统重定向的机制。请注意,64 位应用程序不能使用 Sysnative 别名,因为它是虚拟目录而不是真实目录。

于 2012-08-08T14:39:36.273 回答