Разница между 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, то сделайте .... Чего я не понимаю, так это почему они не использовали один из методов исключительно для поиска пути к приложению.


person JuiCe    schedule 29.07.2014    source источник


Ответы (2)


Они не указывают на один и тот же путь.

  • App.Path: путь, по которому находится исполняемый в данный момент EXE/DLL.
  • CreateObject("Shell.Application").NameSpace(ssfLOCALAPPDATA).Self.Path: будет указывать на локальную (не перемещаемую) папку пользователя данных приложения. То же, что и значение в (пользовательской) переменной среды LOCALAPPDATA.

Начиная с Windows XP, перемещаемые и локальные пути к данным приложения являются предпочтительными местами для хранения пользовательских настроек и файлов (вместо папки приложения с вероятным ограничением прав).

Итак, что делает код:

  1. Найдите strAppDataFile в %LOCALAPPDATA%\DataFolder\ (например, где "%LOCALAPPDATA%" может указывать на "C:\Users\UserName\AppData\Local\" в Windows Vista/7)
  2. Если не нашли, ищите такой же файл в папке приложения.

Обратите внимание, что желательно, чтобы приложения создавали подкаталог для конкретного приложения в локальных/перемещаемых данных приложения, например. используйте что-то вроде:

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\"
person johnwait    schedule 29.07.2014

Я предполагаю, что когда программа устанавливается для каждой машины, используется расположение для каждого пользователя в LocalAppData. Однако во время разработки или при установке для каждого пользователя или в качестве переносного приложения используется папка приложения.

Некоторые программисты используют что-то вроде рассматриваемого кода, в то время как другие принимают решение, сравнивая App.Path с путем ssfPROGRAMFILES для определения среды. Последнее, вероятно, предпочтительнее по ряду причин, но в вырожденном случае, когда на машине существует только один экземпляр программы, они эквивалентны.

person Bob77    schedule 29.07.2014