2

クライアントのコンピューターのフォルダー構造に生のファイルを保存したいアプリケーションがあります。この EXE は完全にスタンドアロンであり、CD から実行されているか、読み取り専用の場所から実行されている可能性があります。したがって、データを EXE の場所に保存できません。基本的に、ファイルを保存する場所、または適切な場所に保存する場所をWindowsに「尋ね」たいと思います。

このデータをクライアント コンピューターのどこに保存すればよいでしょうか。ただし、アプリケーションが通常データを保存する場所に、ある程度永続的に保存する必要があります。このアプリケーションにはインストーラーがないため、特定のプログラム データ フォルダーへのアクセス許可がどのように機能するかわかりません。アプリケーションの共通パスを作成する例が必要です。同じマシン上で実行されているアプリのインスタンスは、このデータ専用のこの 1 つの場所を参照する必要があります。

PS - データベースは長期間無傷のままであることが予想されるため、半一時的なデータベースを意味しますが、クリーンアップのために消去される可能性があり、その場合、自動的に新しいデータベースが作成されます。データ自体は、キャッシュのようなものと見なすことができます。

編集

Windows ユーザー セッションに関する限り、これはすべての Windows セッションのグローバルな場所になることを意図しており、このアプリケーションは実際にはセッション 0 で実行されるサービスです。

4

2 に答える 2

5

MSDN CSIDL リストを参照し、 SHGetFolderPath() 関数を使用します。

CSIDL CSIDL_COMMON_APPDATA を物理ディレクトリにマップします。

MSDN から:

すべてのユーザーのアプリケーション データを含むファイル システム ディレクトリ。一般的なパスは、C:\Documents and Settings\All Users\Application Data です。このフォルダーは、ユーザー固有ではないアプリケーション データに使用されます。たとえば、アプリケーションは、スペル チェック辞書、クリップ アートのデータベース、またはログ ファイルを CSIDL_COMMON_APPDATA フォルダーに格納できます。この情報はローミングされず、コンピュータを使用しているすべてのユーザーが利用できます。

このディレクトリの下に、ベンダー (会社) にちなんで名付けられたディレクトリを作成し、その下にアプリケーションのディレクトリを作成します。次に、そこにデータベースを配置します。

注: CSIDL_COMMON_DOCUMENTS/FOLDERID_PublicDocuments は使用しないでください。これは、さまざまなアプリケーション間で共有できるドキュメントのようなファイル用です。データベースなどの独自のデータには、 CSIDL_COMMON_APPDATA を使用します。また、CSIDL_COMMON_DOCUMENTS 内のファイルは、オペレーティング システムによって「ローミング」される可能性があります。これは、一時データベースには絶対に望ましくないことです。

注: Vista 以降ではSHGetKnownFolderPath()を使用しますが、XP またはクロスバージョンでは SHGetFolderPath() を使用します。

于 2012-12-05T01:20:06.820 に答える
2

一時データについて話しているので、最も明白なパスは Windows 一時ディレクトリです。

function GetTempDirectory: String;
var
  TempFolder: array[0..MAX_PATH] of Char;
begin
  GetTempPathW(MAX_PATH, @TempFolder);
  Result := TempFolder;
end;

アプリケーションがアクティブである限り、ファイルを開いたままにしておくようにしてください。これにより、ユーザーは一時ディレクトリを消去するときにいつでもファイルを削除できなくなります。

于 2012-12-05T13:30:34.967 に答える