3

データ(アクセスファイル)をアプリケーションフォルダーのサブフォルダーに格納するVB6アプリケーションを管理しています。したがって、ユーザーがアプリケーションをC:\Program Files\MyAppデータのデフォルトの場所にインストールすると、最終的に仮想ストアに配置されます。これで、1000程度のApp.Pathステートメントを、セキュリティの問題が発生しないDataフォルダーへのパスに変換するというすばらしいタスクが与えられました。Users\< Username>\AppData\Local\誰かがフォルダ内のデータを処理する方法を私にスプーンフィードするいくつかのリソースへの道を示すことによって私を助けてくれますか?
ローカルのAppDataフォルダーを使用する必要がありますか、それともユーザーに適切な場所を選択させることができますか?

4

4 に答える 4

2

ローカルのAppDataフォルダーを使用します。

Dim sAppData As String

sAppData = Environ("USERPROFILE") & "\AppData"
于 2010-12-19T23:30:38.820 に答える
2

いくつかのことを想定すると、次のようになります。

  • これはVista以降の問題です。
  • データは、App.Pathの下のサブフォルダーにあります。

...使用される可能性のある一種の回避策があります。

このトリックを使用するのは、App.Pathの下のフォルダー内のデータを使用するように作成された古いVB6プログラムがたくさんある場合のみです。これは、多くのプログラムをすばやく動作させるための、迅速で汚いハックのようなものです。ほとんどの場合、仮想化を防ぐために、アプリケーションマニフェストも追加または更新します。


私が行う変更は次のとおりです。

  • サブメインに小さなコードを追加します(プログラムにまだサブメインがない場合は、サブメインを挿入します)。
  • 2つのクラスモジュール(新しいサブメインコードによって呼び出される)をプロジェクトに追加します。

新しいプログラムを展開する場合、Vista以降では、プログラムを管理者として1回実行する必要があります。私のアドインコードの最新バージョンでは、プログラムは必要に応じて昇格して再実行するようにユーザーに促し、OKになるとそれを実行して自己終了します。

最初の実行後は、Win2K、XPなどで実行したのと同じように実行され、すべてがハンキードーリーになるはずです。


昇格を必要とするこのスタートアップコードは、PathLinksクラスに必要なApp.Pathサブフォルダーのリストを提供します。

Pathlinksは、パブリック特殊フォルダーの下にプログラムフォルダーを作成し、その下のデータに一致するサブフォルダーを作成します。次に、これらのApp.Pathサブフォルダー内のファイルとサブフォルダーを新しい場所に移動します。最後に、App.Pathの下にある新しいフォルダへのシンボリックリンクを作成します。

Vistaより前のWindowsで実行している場合、PathLinksは、まだ存在していない(つまり、インストールによって)App.Pathサブフォルダーのリスト(App.Pathの下)を作成するだけです。

ここから、プログラムはApp.Pathの使用をまったく変更することなく、新しい場所にあるファイルを検索します。


2つのアドインクラスの1つは表面的なものであり、削除できます。MsgBox呼び出しを使用する代わりに、スタートアップコードがTaskDialogを呼び出せるようにするだけです。

PathLinksに投稿された最新バージョンをスクロールダウンしてください-Vista+でApp.Pathを飼いならす

サンプルプロジェクトは、「初めて昇格した」トリックを実行すると、アプリケーションの実行をスキップすることに注意してください。データを再配置してそれにシンボリックリンクした後、サブメインでExitSubを実行するだけです。

于 2010-12-21T00:15:28.523 に答える
0

有用な議論はここにあります

于 2010-12-27T09:43:14.007 に答える
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"が設定されます。

敬具

于 2020-04-02T14:32:26.783 に答える