Перемещение папки данных VB6 из программных файлов

Я поддерживаю приложение VB6, которое хранит свои данные (файлы доступа) во вложенной папке папки приложения. Итак, когда пользователь устанавливает приложение в местоположение по умолчанию C:\Program Files\MyApp, данные попадают в виртуальное хранилище. Теперь мне дали милую задачу преобразовать около 1000 операторов App.Path в путь к папке Data, которая не будет иметь никаких проблем с безопасностью. Может ли кто-нибудь помочь мне, указав путь к некоторым ресурсам, которые подскажут мне, как обрабатывать данные в папке Users\< Username>\AppData\Local\?
Должен ли я использовать локальную папку AppData или я могу попросить пользователя выбрать подходящее место?


person Dabblernl    schedule 19.12.2010    source источник
comment
Практически дублирует этот вопрос. Посмотрите принятый ответ, сделанный мной с помощью Боба Римерсмы и Коди Грея   -  person MarkJ    schedule 20.12.2010
comment
Некоторое время назад я испытал именно эту проблему. Мои соболезнования. Просто примечание, App.Path несовместим в том смысле, что он возвращает 'C: \' для корня, но опускает последний '\' для других каталогов. Мы создали для него функцию оболочки. Скорее всего, это никогда не будет проблемой, но знать об этом полезно.   -  person jakdep    schedule 20.12.2010
comment
@MarkJ: этот вопрос действительно является точной копией другого, на который вы так красноречиво и элегантно ответили. Я проголосую за закрытие этого.   -  person Dabblernl    schedule 20.12.2010


Ответы (4)


Я бы использовал локальную папку AppData:

Dim sAppData As String

sAppData = Environ("USERPROFILE") & "\AppData"
person Mitch Wheat    schedule 19.12.2010

Хорошо, если предположить несколько вещей:

  • Это проблема только для Vista или более поздних версий.
  • Ваши данные находятся в подпапках в App.Path.

... У меня есть своего рода обходной путь, который можно использовать.

Обратите внимание, что я использую этот трюк только тогда, когда у меня есть куча старых программ VB6, которые были написаны для использования данных в папках под App.Path, своего рода быстрый и грязный прием, чтобы быстро заставить множество программ работать. Я почти всегда добавляю или обновляю манифест приложения, в основном для предотвращения виртуализации.


Я вношу следующие изменения:

  • Добавьте небольшой код в Sub Main (вставив Sub Main, если в программе его еще нет).
  • Добавьте в проект два модуля класса (вызываемые новым вспомогательным основным кодом).

При развертывании новой программы в Vista или более поздней версии ее необходимо запустить один раз от имени администратора. В последней версии моего кода надстройки программа предложит пользователю повторно запустить ее с повышенными правами, если это необходимо, а после подтверждения она сделает это и завершит работу.

После первого запуска все должно быть в порядке, работать так же, как в Windows 2000, XP и т. Д.


Этот код запуска, требующий повышения прав, предоставляет список подпапок App.Path, необходимых для класса PathLinks.

Pathlinks создает программную папку в специальной папке Public, а затем создает соответствующие подпапки для данных в этой папке. Затем он перемещает все файлы и подпапки в этих подпапках App.Path в новые места. Наконец, он создает символические ссылки на новые папки обратно в App.Path.

При запуске под Windows до Vista, PathLinks просто создает любую из списка подпапок App.Path (в App.Path), которые еще не существуют (т. Е. Путем установки).

С этого момента программа найдет файлы в новом месте без каких-либо изменений в использовании App.Path.


Один из двух классов надстройки является косметическим, и вы можете удалить его. Он просто позволяет коду запуска вызывать TaskDialog вместо использования вызова MsgBox.

Не забудьте прокрутить вниз, чтобы увидеть последнюю версию, размещенную на странице PathLinks - Tame App.Path под Vista +

Обратите внимание, что в примере проекта приложение не запускается, когда оно выполняет этот трюк с «первым повышенным уровнем». Он просто выполняет Exit Sub в Sub Main после перемещения данных и создания символьной ссылки на них.

person Bob77    schedule 21.12.2010
comment
Обратите внимание, что вы можете взять код и вместо добавления его в приложение создать небольшой помощник после установки. Для установки PDW вы даже можете создать собственный файл Setup1.exe, который выполняет эти шаги в конце, или написать помощник для запуска переименованного Setup1 (назовите его Setup2), назовите помощник Setup1, чтобы программа начальной загрузки запускала вспомогательную программу, которая запускает переименованный Setup2 ожидает завершения, удаляет Setup2, затем перемещает данные и создает символические ссылки. - person Bob77; 22.12.2010
comment
Спасибо за это, но я сделаю долгий и мучительный способ удаления всех ссылок на App.Path. - person Dabblernl; 27.12.2010

Полезное обсуждение можно найти здесь

person Dabblernl    schedule 27.12.2010

Я не знаю, искал ли кто-то (иначе, поскольку я все еще искал) это. но я нашел хороший ответ на этой странице http://www.vbforums.com/showthread.php?564256-Classic-VB-Where-should-I-store-the-files-that-my-program-uses-created

Я использовал этот код, чтобы получить правильный путь к папке.

'this peace of code must be on the top of jour module in the declaration part.
Public Enum eSpecialFolders
  SpecialFolder_Documents = &H5         'the Documents folder for the current Windows user
  SpecialFolder_Favorites = &H6         'for the Favorites folder
  SpecialFolder_Videos = &HD            'For the Video's folder
  SpecialFolder_Desktop = &H10          'for the desktop folder
  SpecialFolder_AppData = &H1A          'for the current Windows user, on any computer on the network [Windows 98 or later]
  SpecialFolder_LocalAppData = &H1C     'for the current Windows user, on this computer only [Windows 2000 or later]
  SpecialFolder_CommonAppData = &H23    'for all Windows users on this computer [Windows 2000 or later]
  SpecialFolder_Windows = &H24          'for the windows folder
  SpecialFolder_System32 = &H25         'For the windows system32 folder
  SpecialFolder_Pictures = &H27         'for the picture folder
  SpecialFolder_User = &H28             'for user folder C:\Users\sidxxxx
End Enum

'this can be placed before or after other functions
Public Function SpecialFolder(pFolder As eSpecialFolders) As String
'Returns the path to the specified special folder (AppData etc)

Dim objShell  As Object
Dim objFolder As Object

  Set objShell = CreateObject("Shell.Application")
  Set objFolder = objShell.namespace(CLng(pFolder))

  If (Not objFolder Is Nothing) Then SpecialFolder = objFolder.Self.Path

  Set objFolder = Nothing
  Set objShell = Nothing

  If SpecialFolder = "" Then Err.Raise 513, "SpecialFolder", "The folder path could not be detected"

End Function

Я использовал его в том же модуле, как этот, в другой функции.

FileName = SpecialFolder (SpecialFolder_AppData) & "\ Log \" & "log.log"

это установит FileName = "C: \ Users \ username \ AppData \ Roaming \ Log \ log.log"

С уважением

person Tibirius    schedule 02.04.2020