.NET TIPS ClickOnceデータ・ディレクトリのパスを取得するには?[2.0のみ、C#、VB]デジタルアドバンテージ 一色 政彦2006/09/29 |
![]() |
|
ClickOnceで配置したアプリケーション(以降、ClickOnceアプリ)は、自動的にClickOnce独自のアプリケーション・ストア(以降、ClickOnceキャッシュ領域)に格納されるが、ClickOnceアプリが使用するデータ・ファイル(.XMLファイルや.MDBファイルなど)だけは別のClickOnceデータ・ディレクトリに格納される。
ClickOnceデータ・ディレクトリとは?
ClickOnceにおいてデータ・ファイルとは、「アプリケーションを更新(=アップデート)した後も、そのまま引き続き利用したいファイル」を意味する。ClickOnceデータ・ディレクトリに格納したすべてのデータ・ファイルは、更新前のClickOnceディレクトリから更新後のディレクトリへコピーされる。
このため、アプリケーションを更新してもデータ・ファイルは新しいファイルで上書きされたりせずに、既存のデータがそのまま引き継がれるのである。(※一方のClickOnceキャッシュ領域に格納されているすべてのファイルは(それがたとえ.MDBファイルであっても)、アプリケーションを更新すると上書きされて元に戻されてしまう。このため、ClickOnceキャッシュ領域にデータ・ファイルを格納することはできない)。
このClickOnceデータ・ディレクトリにデータ・ファイルを格納するには、ClickOnceアプリを配布・更新する際に、該当のファイルの[発行の状況]を「データ ファイル」に指定してClickOnceの発行を行えばよい(具体的な設定方法は「ClickOnceの真実 第3回 Visual Studio 2005でClickOnceを極めよう」を参照されたい)。また、アプリケーション実行時に動的にデータ・ファイルを作成したいような場合には、このClickOnceデータ・ディレクトリに直接ファイルを作成すればよい。
ただし、ClickOnceデータ・ディレクトリのファイルであっても、2パターンほどアプリケーションの更新時に上書きされてしまうケースがあるので注意が必要だ。1つは「ClickOnceにより配布するデータ・ファイル自体を更新した場合」である。もう1つは「更新前のアプリケーションがその実行中にClickOnceデータ・ディレクトリ内に何らかのファイルを作成した場合、それと同名のファイルがアプリケーションを更新する際に配布された場合」である。
【注意】既存のデータ・ファイルが上書きされた場合の対処 |
なお、何らかの手違いでデータ・ファイルが上書きされてしまった場合でも、以前のデータ・ファイルを復活させることは可能だ。古いデータ・ファイルは、実は、ClickOnceデータ・ディレクトリ直下の「.pre」フォルダに保存されている。従って、本稿で紹介する方法により取得したClickOnceデータ・ディレクトリのパスに「.pre」というフォルダ名を付け足してアクセスすればよい。 |
実際にClickOnceデータ・ディレクトリのデータ・ファイルを活用するには、まずClickOnceデータ・ディレクトリのパスを取得する必要がある。
ClickOnceデータ・ディレクトリのパスの取得方法
ClickOnceキャッシュ領域およびClickOnceデータ・ディレクトリは、ユーザーごとに存在する「C:\Documents and Settings\<ユーザー名>\Apps\2.0」フォルダの配下にあり、その中でさらにアプリケーションごとのフォルダに分けられて存在する。なお、ClickOnceキャッシュ領域(=ClickOnceアプリのディレクトリ)のパスを取得する方法については、「TIPS:ClickOnceアプリのディレクトリ・パスを取得するには?」で紹介している。
ClickOnceデータ・ディレクトリのパスを取得するには、ApplicationDeploymentクラス(System.Deployment.Application名前空間)で提供されている次のプロパティを利用すればよい。
DataDirectoryプロパティ
このプロパティはClickOnceデータ・ディレクトリのフル・パスを文字列で取得するためのものだ(読み取り専用)。
これを実際に使った例が、次のサンプル・プログラムである。
|
||
ClickOnceデータ・ディレクトリのパスを取得するサンプル・プログラム(上:C#、下:VB) | ||
このサンプル・プログラムをビルドするにはSystem.Deployment.Applicationアセンブリ(System.Deployment.Application.dll)への参照が必要である。 |
このコードでは、ApplicationDeploymentクラスの静的プロパティCurrentDeploymentにより現在のApplicationDeploymentオブジェクトを取得し、そのDataDirectoryプロパティからClickOnceデータ・ディレクトリのフル・パスを取得している。
別の方法によるClickOnceデータ・ディレクトリのパスの取得
上記の方法以外にも、Applicationクラス(System.Windows.Forms名前空間)のLocalUserAppDataPathプロパティからでもClickOnceデータ・ディレクトリのフル・パスを取得することが可能だ。
また、次のコード例(C#)のように、“DataDirectory”というアプリケーション・ドメイン・プロパティからも取得できる。
string dataDir =
(string)AppDomain.CurrentDomain.GetData("DataDirectory");
基本的にこの“DataDirectory”の値は、SQL Server 2005 Express Edition(以降、SQLEXPRESS)のユーザー・インスタンス機能を使ってデータベース・ファイルへアタッチする際、その接続文字列に含める“AttachDbFilename”プロパティの値として指定可能な“|DataDirectory|”という特殊なトークン名として使われるものだ(AttachDbFilenameについては「NAgileで始める実践アジャイル開発 第3回 ソフトウェアの良い設計を行うコツ ―ファイル・アタッチ機能の利用」を参照してほしい)。
つまりClickOnceアプリでSQLEXPRESSのデータベース・ファイル(.mdfファイル)をアタッチして使いたい場合には、まず、そのデータベース・ファイルをデータ・ファイルとしてClickOnceデータ・ディレクトリに格納しておき、あとはそのデータベース・ファイルへの接続文字列で、例えば“|DataDirectory|\Database1.mdf;”のようなパスを指定するだけで(つまり厳密なフル・パス名を指定しなくても)、ClickOnceデータ・ディレクトリに格納されているデータベース・ファイルへアクセスできるわけである。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Windowsフォーム 処理対象:ClickOnce 使用ライブラリ:ApplicationDeploymentクラス(System.Deployment.Application名前空間) 関連TIPS:TIPS:ClickOnceアプリのディレクトリ・パスを取得するには? |
|
![]() |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
![]() |
|
|
|
![]() |