.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データ・ディレクトリのフル・パスを文字列で取得するためのものだ(読み取り専用)。

 これを実際に使った例が、次のサンプル・プログラムである。

using System;
using System.Deployment.Application;

class Program
{
  static void Main(string[] args)
  {
    // ClickOnceデータ・ディレクトリのフル・パスを取得する
    string dirPath =
      ApplicationDeployment.CurrentDeployment.DataDirectory;

    // 取得したパスの文字列をコンソールに出力
    Console.WriteLine(dirPath);
    // ユーザーに入力を要求することでプログラム実行を一時停止
    Console.ReadLine();
  }
}

// 筆者の環境での実行結果:
// C:\Documents and Settings\masa-i.D-ADVANTAGE\Local Settings\Apps\2.0\Data\M6J2QAXP.8R7\QDX898RM.YJP\cons..tion_e75bf18b22b7a9e1_0001.0000_cbf86ecbaa6306bc\Data
Imports System.Deployment.Application

Class Program

  Shared Sub Main()
    ' ClickOnceデータ・ディレクトリのフル・パスを取得する
    Dim dirPath As String = _
      ApplicationDeployment.CurrentDeployment.DataDirectory

    ' 取得したパスの文字列をコンソールに出力
    Console.WriteLine(dirPath)
    ' ユーザーに入力を要求することでプログラム実行を一時停止
    Console.ReadLine()
  End Sub

End Class

' 筆者の環境での実行結果:
' C:\Documents and Settings\masa-i.D-ADVANTAGE\Local Settings\Apps\2.0\Data\M6J2QAXP.8R7\QDX898RM.YJP\cons..tion_e75bf18b22b7a9e1_0001.0000_cbf86ecbaa6306bc\Data
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データ・ディレクトリに格納されているデータベース・ファイルへアクセスできるわけである。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Windowsフォーム 処理対象:ClickOnce
使用ライブラリ:ApplicationDeploymentクラス(System.Deployment.Application名前空間)
関連TIPS:TIPS:ClickOnceアプリのディレクトリ・パスを取得するには?

この記事と関連性の高い別の.NET TIPS
ClickOnceアプリのディレクトリ・パスを取得するには?
ClickOnceのログ・ファイルを特定の場所に作成するには?
ClickOnceアプリケーションをデバッグするには?
ClickOnceオンライン・キャッシュ領域のサイズを変更するには?
ClickOnceアプリの起動時にパラメータを渡すには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH