Я поддерживаю приложение VB6, которое хранит свои данные (файлы доступа) во вложенной папке папки приложения. Итак, когда пользователь устанавливает приложение в местоположение по умолчанию C:\Program Files\MyApp
, данные попадают в виртуальное хранилище. Теперь мне дали милую задачу преобразовать около 1000 операторов App.Path в путь к папке Data, которая не будет иметь никаких проблем с безопасностью. Может ли кто-нибудь помочь мне, указав путь к некоторым ресурсам, которые подскажут мне, как обрабатывать данные в папке Users\< Username>\AppData\Local\
?
Должен ли я использовать локальную папку AppData или я могу попросить пользователя выбрать подходящее место?
Перемещение папки данных VB6 из программных файлов
Ответы (4)
Я бы использовал локальную папку AppData:
Dim sAppData As String
sAppData = Environ("USERPROFILE") & "\AppData"
Хорошо, если предположить несколько вещей:
- Это проблема только для 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 после перемещения данных и создания символьной ссылки на них.
Я не знаю, искал ли кто-то (иначе, поскольку я все еще искал) это. но я нашел хороший ответ на этой странице 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"
С уважением