为何FileExists(path)在Programs (x86)文件夹中无法正常工作?
问题:路径含Programs (x86)时无法检测到gbak.exe存在
需求为检查特定.exe文件是否存在,存在则继续执行,否则弹出错误提示。相关VB代码如下:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnCreateBackup.Click Dim path As String = txtFirebirdPath.Text & "\gbak.exe" If My.Computer.FileSystem.FileExists(path) Then ... Else ... End if End Sub
*txtFirebirdPath是文本框,选择文件夹后其Text属性存储选中路径。
明明gbak.exe存在于目标路径,但程序提示不存在,测试桌面等其他路径可正常检测,仅路径包含Programs (x86)时出现问题。
原因分析
- UAC虚拟化干扰:Windows用户账户控制(UAC)会对非管理员权限运行的程序做文件系统重定向,访问
Program Files (x86)这类受保护系统目录时,程序实际访问的是VirtualStore下的虚拟路径,而非真实目录,导致FileExists检测不到真实存在的文件。 - 路径拼接不规范:若
txtFirebirdPath.Text末尾已带有反斜杠,手动拼接会生成双反斜杠路径(如C:\Program Files (x86)\Firebird\\gbak.exe),虽多数情况不影响,但可能引发个别场景下的路径识别异常。
解决办法
获取管理员权限运行
修改项目的app.manifest文件,将权限请求节点改为:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />程序启动时会触发UAC权限请求,获得权限后可直接访问真实的
Program Files (x86)目录,避免虚拟化干扰。使用规范化路径拼接
替换手动拼接为Path.Combine方法,自动处理路径分隔符:Dim path As String = Path.Combine(txtFirebirdPath.Text, "gbak.exe")该方法会根据输入自动调整分隔符,生成合法的标准路径。
验证虚拟路径(不推荐)
若无法提升权限,可检查C:\Users\[当前用户名]\AppData\Local\VirtualStore\Program Files (x86)下的对应文件,但此路径仅为虚拟化后的副本,无法代表真实系统目录的文件状态。
内容的提问来源于stack exchange,提问作者Peety
相关产品推荐
相关产品推荐

