我正在转换一个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开始,漫游&本地应用程序数据路径是存储用户设置和文件的首选位置(而不是可能受权限限制的应用程序文件夹)。
代码的作用是:
- 在%LOCALAPPDATA%DataFolder中查找strAppDataFile(例如,在Windows Vista/7中,"%LOCALAPPDATA%"可以指向"C:UsersUserNameAppDataLocal")
- 如果没有找到,在应用程序文件夹中查找相同的文件。
请注意,应用程序最好在本地/漫游应用程序数据中创建一个特定于应用程序的子目录,例如:
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路径来确定环境。由于许多原因,后者可能更可取,但在简并情况下,在一台机器上只存在一个程序实例,它们是等效的。