データ(アクセスファイル)をアプリケーションフォルダーのサブフォルダーに格納するVB6アプリケーションを管理しています。したがって、ユーザーがアプリケーションをC:\Program Files\MyApp
データのデフォルトの場所にインストールすると、最終的に仮想ストアに配置されます。これで、1000程度のApp.Pathステートメントを、セキュリティの問題が発生しないDataフォルダーへのパスに変換するというすばらしいタスクが与えられました。Users\< Username>\AppData\Local\
誰かがフォルダ内のデータを処理する方法を私にスプーンフィードするいくつかのリソースへの道を示すことによって私を助けてくれますか?
ローカルのAppDataフォルダーを使用する必要がありますか、それともユーザーに適切な場所を選択させることができますか?
4 に答える
ローカルのAppDataフォルダーを使用します。
Dim sAppData As String
sAppData = Environ("USERPROFILE") & "\AppData"
いくつかのことを想定すると、次のようになります。
- これは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を実行するだけです。
有用な議論はここにあります
誰かがこれを探しているかどうかはわかりません(私はまだそれを探していたので)。しかし、私はこのページで良い答えを見つけました 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"が設定されます。
敬具