App.Path和使用ShellObject.Self.Path的区别



我正在转换一个VB6应用程序到VB.NET。在我正在转换的代码中,似乎开发人员发现了两种不同的应用程序路径。然而,他似乎希望这两种方法产生不同的结果。

简单的问题:

调用这两行代码的区别是什么?

strAppDataPath = CreateObject("Shell.Application").
                             NameSpace(ssfLOCALAPPDATA).Self.Path

strAppDataPath = App.Path

解释:

这是问题中的代码:

strAppDataPath = CreateObject("Shell.Application").
                             NameSpace(ssfLOCALAPPDATA).Self.Path
strAppDataPath = strAppDataPath & "DataFolder"

If (Not objFileSystem.FileExists(strAppDataPath & strAppDataFile)) Then
    If (objFileSystem.FileExists(App.Path & strAppDataFile)) Then
        ...
    End If
End If

应用程序的路径附加DataFolder,并存储在字符串strAppDatapath中。

检查strAppDataFile 文件在strAppDatapath中是否不存在。然后检查文件App.Path中是否存在

这背后的概念对我来说是有意义的:如果文件不存在于子文件夹中,如果文件存在于App.Path中,那么执行...。我不明白的是为什么他们不使用一种方法来查找应用程序的路径。

它们不指向相同的路径。

  • 应用程序。Path:当前执行的EXE/DLL所在路径。
  • CreateObject (Shell.Application) .NameSpace .Self (ssfLOCALAPPDATA)。Path:将指向本地(非漫游)应用数据用户文件夹。与(用户)环境变量LOCALAPPDATA中的值相同。

从Windows XP开始,漫游&本地应用程序数据路径是存储用户设置和文件的首选位置(而不是可能受权限限制的应用程序文件夹)。

代码的作用是:

  1. 在%LOCALAPPDATA%DataFolder中查找strAppDataFile(例如,在Windows Vista/7中,"%LOCALAPPDATA%"可以指向"C:UsersUserNameAppDataLocal")
  2. 如果没有找到,在应用程序文件夹中查找相同的文件。

请注意,应用程序最好在本地/漫游应用程序数据中创建一个特定于应用程序的子目录,例如:

strAppDataPath = strAppDataPath & "" & App.ProductName & "DataFolder"
' NOTE: Make sure to set the "Product Name" entry in the version information
'       of the project settings

可以解析为类似

的内容
"C:UsersUserNameAppDataLocalMy ApplicationDataFolder"

我的猜测是,当程序安装在每台机器上时,使用LocalAppData下的每个用户位置。但是,在开发过程中,或在每个用户安装或作为便携式应用程序时,使用应用程序文件夹。

一些程序员使用类似于问题中的代码的东西,而另一些程序员则通过比较App.Path和ssfPROGRAMFILES路径来确定环境。由于许多原因,后者可能更可取,但在简并情况下,在一台机器上只存在一个程序实例,它们是等效的。

最新更新