将VB6的Data文件夹移出Program Files

时间:2010-12-19 22:25:43

标签: vb6 appdata

我维护一个VB6应用程序,将其数据(访问文件)存储在应用程序文件夹的子文件夹中。因此,当用户将应用程序安装到默认位置C:\Program Files\MyApp时,数据最终会进入虚拟存储。我现在已经完成了将1000个左右的App.Path语句转换为不存在任何安全问题的Data文件夹的路径的甜蜜任务。有人可以通过指向一些资源来帮助我,这些资源会向我提供如何处理Users\< Username>\AppData\Local\文件夹中的数据吗?
我应该使用本地AppData文件夹,还是让用户选择合适的位置?

4 个答案:

答案 0 :(得分:2)

好吧,如果我们假设一些事情:

  • 这只是Vista或更高版本的问题。
  • 您的数据位于App.Path。
  • 下的子文件夹

......我有一种可能会使用的解决方法。

请注意,当我有一堆旧的VB6程序被编写为使用App.Path下面的文件夹中的数据时,我只使用这个技巧,这是一种快速而肮脏的黑客攻击,可以让很多程序快速运行。我几乎总是添加或更新应用程序清单,主要是为了防止虚拟化。


我所做的更改是:

  • 向Sub Main添加一些代码(如果程序还没有Sub Main,则插入Sub Main)。
  • 将两个Class模块(由新的Sub Main代码调用)添加到项目中。

部署新程序时,在Vista或更高版本上,程序需要以管理员身份运行。在我的加载项代码的最新版本中,程序将提示用户在需要时重新运行它,并且当OK,它会这样做并自行终止。

第一次运行后,一切都应该是hunky-dory,运行方式与Win2K,XP等相同。


此需要提升的启动代码提供了PathLinks类所需的App.Path子文件夹列表。

Pathlinks在Public特殊文件夹下创建一个程序文件夹,然后为其下的数据创建匹配的子文件夹。接下来,它将这些App.Path子文件夹中的任何文件和子文件夹移动到新位置。最后,它会在App.Path下为新文件夹创建符号链接。

如果在Vista之前在Windows下运行,PathLinks只会创建任何尚未存在的App.Path子文件夹列表(在App.Path下)(即通过安装)。

从这里开始,程序将在新位置找到文件,而不需要对App.Path的使用进行任何更改。


两个加载项之一是化妆品,您可以将其删除。它只是让启动代码调用TaskDialog而不是使用MsgBox调用。

请务必向下滚动查看PathLinks - Tame App.Path Under Vista+

上发布的最新版本

请注意,示例项目在执行“首次提升”操作时会跳过运行应用程序。在重新定位数据和符号链接后,它只在Sub Main中执行一个Exit Sub。

答案 1 :(得分:1)

我会使用本地AppData文件夹:

Dim sAppData As String

sAppData = Environ("USERPROFILE") & "\AppData"

答案 2 :(得分:0)

可以找到有用的讨论here

答案 3 :(得分:0)

我不知道是否有人(正在搜索它)搜索此文件。 但我在此页面上找到了一个很好的答案 http://www.vbforums.com/showthread.php?564256-Classic-VB-Where-should-I-store-the-files-that-my-program-uses-creates

我使用此代码获取正确的文件夹路径。

'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”

亲切问候