Vb.net x86和x64中的File.opendirectory行为不同吗

Vb.net x86和x64中的File.opendirectory行为不同吗,vb.net,x86,.net-4.0,64-bit,filenotfoundexception,Vb.net,X86,.net 4.0,64 Bit,Filenotfoundexception,我正在开发一个在VB.Net中构建的应用程序,它允许将文档上传并保存到数据库中。我并没有构建这个应用程序,但我确实维护了它,并在这里和那里进行了增强。目标框架是.Net4 上载和保存文档时,此过程中的一项功能是使用File.Open()方法访问该文件,并运行其他方法对其进行压缩。使用File.Open的方法接收一个参数,该参数只传递文件名,而不传递文件名来源的整个路径 当此应用程序在x64计算机上运行时,当代码命中File.Open方法时,我收到一个错误(System.IO.FileNotFou

我正在开发一个在VB.Net中构建的应用程序,它允许将文档上传并保存到数据库中。我并没有构建这个应用程序,但我确实维护了它,并在这里和那里进行了增强。目标框架是.Net4

上载和保存文档时,此过程中的一项功能是使用File.Open()方法访问该文件,并运行其他方法对其进行压缩。使用File.Open的方法接收一个参数,该参数只传递文件名,而不传递文件名来源的整个路径

当此应用程序在x64计算机上运行时,当代码命中File.Open方法时,我收到一个错误(System.IO.FileNotFoundException),抱怨它找不到要打开的文件。它希望文件位于程序执行目录中,这是有意义的,因为它只被赋予文件名,而不是它来自的整个目录

让我感到困惑的是,当在x86系统上运行时,这个完全相同的应用程序(完全相同的构建程序集)将运行良好。它不会在File.Open()上失败。它仍然只传递文件名,但不知何故,它会知道目录信息

这怎么可能

值得注意的是,包含File.Open()方法的方法位于同一解决方案中的不同项目中。它是一个被引用的DLL。e、 g.MyApp.exe(Windows窗体应用程序)引用MyUtil.dll(类库)。我已经针对x86、x64和任何CPU配置进行了构建

我知道解决这个问题的方法是将整个目录传递给该方法,但我需要知道的是这是如何实现的?我想更好地理解为什么会发生这种情况,希望这能帮助其他人更好地理解不同系统环境之间的程序集可能存在的差异


编辑:使用绝对路径确实解决了根本问题。有关此方案的一些有用信息,请参见下面的注释

Windows对64位系统上的某些文件夹名称进行了特殊处理,具体取决于您使用的是32位还是64位进程。值得注意的是,
程序文件
文件夹和
System32
文件夹的映射不同,具体取决于您的流程类型

请注意,这是Windows本身的一个区别。这不是.Net或Visual Basic独有的行为。任何使用Windows本机文件处理的程序平台都会提供这些结果


这就是为什么您应该使用适当的相对路径或
SpecialFolders
枚举,而不是硬编码完整的路径名,并且要小心将您希望稍后引用的内容放在何处;你可能会发现他们最终的位置与你预期的不同。通常,
AppData
programmadata
文件夹是更正确的位置,而不是
Windows
Program Files
文件夹。

希望文件位于程序执行目录中,这是一个错误。Windows长期以来一直为
用户
程序数据
等数据提供目录,为可执行文件提供目录,为Windows系统文件提供目录。对Windows文件系统虚拟化进行DuckDuckGo搜索。有很多热门歌曲。其中包括(随机挑选的)。从该链接:例如,如果旧版应用程序尝试写入Program Files目录,UAC会自动将该操作重定向到未受保护的用户特定文件夹。您是否尝试使用写入权限打开该文件,或者只是读取?@VisualIncent只是读取权限。相对路径是相对于应用程序的工作目录的,可以很容易地进行更改,并且有许多不同的原因。如果尝试使用绝对路径,会发生什么?例如:
Path.Combine(Application.StartupPath,“yourfilenamehere”)