App.Path与使用ShellObject.Self.Path之间的区别

时间:2014-07-29 15:25:10

标签: path vb6 filesystemobject

我正在将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中,则执行...。我不明白的是为什么他们没有使用其中一种方法专门找到应用程序的路径。

2 个答案:

答案 0 :(得分:2)

他们没有指向同一条道路。

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

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

代码的作用是:

  1. 在%LOCALAPPDATA%\ DataFolder \中查找strAppDataFile(例如,"%LOCALAPPDATA%"可指向" C:\ Users \ UserName \ AppData \ Local \" on Windows Vista / 7)
  2. 如果未找到,请在应用程序文件夹中查找相同的文件。
  3. 请注意,应用程序应优先在本地/漫游应用程序数据中创建特定于应用程序的子目录,例如:使用类似的东西:

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

    可以解决类似

    的问题
    "C:\Users\UserName\AppData\Local\My Application\DataFolder\"
    

答案 1 :(得分:1)

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

一些程序员使用类似代码的东西,而其他程序员则通过将App.Path与ssfPROGRAMFILES路径进行比较来确定环境。后者可能有多种原因,但在退化的情况下,只有一个程序实例存在于一台机器上,它们是等价的。