ClickOnceアプリケーションのフォルダーパスを取得する方法


160

コンソールのClickOnce .application(実行可能ファイル)と同じフォルダーにファイルを書き込む必要があります。起動元のフォルダ。

Application.StartupPath&を使用してみましたPath.GetDirectoryName(Assembly.GetExecutingAssembly().Location) が、パスはの下のサブフォルダーを指していますc:\Documents & Settings。が.application存在するパスを取得するにはどうすればよいですか?

回答:


253

フォルダーの場所を見つけるには、アプリを実行し、タスクマネージャー(CTRL-SHIFT-ESC)を開き、アプリを選択して右クリック|ファイルの場所を開くだけです。


3
ちょっと、プロのヒント!しかし、それは古い安っぽいXPマシンでは利用できません。:)
Jalal

5
「Jalal for old crappy machine」の場合は、www.SysInternals.comにアクセスして、Process Explorerをダウンロードします。Win7のTas​​kManagerの変更が疑われ、Win8はそこからコピーされただけです。
アリオク

1
顧客のコンピューターで実行しているアプリケーションでこれをどのように実現しますか?
user3285954 2015

2
どうしても必要なログファイルが削除されるためにアプリケーションを実行できない場合はどうなりますか?
トマーシュZato -復活モニカ

2
@Tony_Henrichあなたはこれを正しい答えとしてマークするべきです
sparkyShorts

120

パスはc:\ Documents&Settingsの下のサブフォルダーを指しています

そのとおり。ClickOnce applicationsそれらをインストールしたユーザーのプロファイルの下にインストールされます。実行中のアセンブリから情報を取得することで得られたパスをたどって、チェックアウトしましたか?

Windows VistaおよびWindows 7では、ClickOnceキャッシュがここにあります。

c:\users\username\AppData\Local\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

Windows XPでは、次の場所にあります。

C:\Documents and Settings\username\LocalSettings\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

1
私はこれをすべて理解しています。アプリをクリックした場所からフォルダーが欲しい。C:\ Documents and Settingsにアクセスできないため、その関数によって返されたフォルダーパスを使用し、ハードコードされたパス値を使用したくない場合は、ログファイルにアクセスできません。 。
Tony_Henrich

25

ApplicationDeployment.CurrentDeployment.ActivationUriが機能する可能性があります

「展開マニフェストのTrustUrlParametersプロパティがfalseの場合、またはユーザーが展開を開くためにUNCを指定したか、ローカルで開いた場合、長さ0の文字列。それ以外の場合、戻り値は、アプリケーションの起動に使用される完全なURLです。パラメータを含めます。」


しかし、あなたが本当に望んでいるのは、データを書き込むことができるフォルダを提供するApplicationDeployment.CurrentDeployment.DataDirectoryです。とにかくアプリケーションを更新すると、元の.exeフォルダーにあったものが失われますが、データディレクトリを新しいバージョンのアプリに移行できます。あなたのアプリは、それが持っているどんなログファイルでもこの​​フォルダーに書き込むことができます-そして、私はそれが書き込み可能であることが保証されていると確信しています。


私は何もしませんでしたが、古いDataDirectoryのファイルはデプロイ後に自動的に新しいDataDirectoryにコピーされます。.preディレクトリもありません。(.NET Framework 3.5および4.5)
Der_Meister 2014年

15

.Net 4.5.1でデプロイされたアプリケーションAssembly.GetExecutingAssembly().Locationへのパスを取得するために使用していますClickOnce

ただし、展開方法(xcopy、ClickOnce、InstallShieldなど)に関係なく、アプリケーションが展開されているフォルダーには書き込みを行わないでください。これらは通常、特に新しいWindowsバージョンおよびサーバー環境では、アプリケーションに対してのみ読み取り専用であるためです。

アプリは常に、そのような目的のために予約されているフォルダーに書き込む必要があります。Environment.SpecialFolder Enumerationから必要なフォルダーを取得できます。MSDNページでは、各フォルダーの目的について説明しています。http//msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

つまりApplicationData、データ、ログ、その他のファイル(ローミング)、LocalApplicationData(ローカル)、またはCommonApplicationData。一時ファイルの場合は、Path.GetTempPathまたはを使用しますPath.GetTempFileName

上記はサーバーとデスクトップでも動作します。

編集: Assembly.GetExecutingAssembly()メインの実行可能ファイルで呼び出されます。


これはClickOnceアプリで私のために機能しており、同じアプリのデバッグ中にVS開発環境でも機能しています。
Developer63

3

ClickOnceアプリケーションは、DO Cのサブディレクトリに存在する:\ドキュメントと設定。ローカルファイルは基本的に「一時的に」ダウンロードされ、アプリケーションをローカルPCで実行でき、アプリケーションの実行は、公開設定に応じて展開されているClickOnceサーバーから制御されるため、「クリーン」なインストールディレクトリはありません。 (アップデート、バージョン要件などの確認)。


サーバーのC:\ Documents&Settingsフォルダーにアクセスできません。つまり、アプリが作成するファイルにアクセスできません。特定のフォルダからアプリを実行します。アプリが公開されるフォルダーです。そのフォルダのパスを取得するにはどうすればよいですか?
Tony_Henrich

ああ、あなたはデプロイメントURLが欲しいです。聞き取れませんでした。ClickOnceアプリケーション内から、または外部アプリケーションから取得しようとしていますか?
RobinDotNet

1

これは、私のclickonceアプリケーションのデプロイされたフォルダーの場所を取得するために機能し、検索で見たどこにも記載されていないことがわかったものです。

  • Clickonceアプリケーションは、会社のLANネットワークフォルダーにデプロイされます。
  • Clickonceアプリケーションは、オンラインまたはオフラインで使用できるように設定されています。
  • プロジェクトプロパティのクリックワンスインストールURLと更新URLには何も指定されていません。つまり、インストールまたは更新のための個別の場所はありません。
  • 私の公開オプションでは、clickonceアプリケーション用に作成されたデスクトップショートカットを使用しています。
  • 起動時にパスを取得したいフォルダーは、パスをハードコーディングせずに、アプリケーションのDEV、INT、およびPRODバージョンからアクセスしたいフォルダーです。

これが私のユースケースのビジュアルです:

ここに画像の説明を入力してください

  • 青いボックスで囲まれたフォルダは、各環境のアプリケーションのディレクトリの場所です。
  • 赤いボックスで囲まれたフォルダーは、パスを取得するディレクトリです(これには、最初にアプリのデプロイされたフォルダーの場所「MyClickOnceGreatApp_1_0_0_37」を取得する必要があります。これはOPと同じです)。

この質問のどの提案も、クリックワンスアプリケーションが展開されたフォルダーを返すのに役立つコメントも見つかりませんでした(目的のフォルダーを見つけるために、このフォルダーに相対的に移動します)。他のインターネット検索や関連するSOの質問も答えを出しませんでした。

提案されたプロパティはすべて、オブジェクト(ActivationUriなど)がnullであるために失敗しているか、ローカルPCのキャッシュされたインストール済みアプリフォルダーを指しています。はい、IsNetworkDeployedのチェックによってnullオブジェクトを正常に処理できました。これは問題ではありませんが、実際には、Clickonceアプリケーションのネットワーク展開フォルダーの場所があるにもかかわらず、IsNetworkDeployedがfalseを返します。これは、アプリケーションがローカルのキャッシュされたビットから実行されているためです。

解決策は次のことです。

  • AppDomain.CurrentDomain.BaseDirectory 開発中にアプリケーションがビジュアルスタジオ内で実行されているとき
  • System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation 正常に実行されているとき。

System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocationすべてのケースで、私のclickonceアプリケーションがデプロイされているネットワークディレクトリを正しく返します。つまり、次の方法で起動されます。

  • setup.exe
  • MyClickOnceGreatApp.application
  • アプリケーションの最初のインストールおよび起動時に作成されるデスクトップショートカット。

これは、WorkAccountsフォルダーのパスを取得するためにアプリケーションの起動時に使用するコードです。デプロイされたアプリケーションフォルダーの取得は、親ディレクトリに移動しないだけで簡単です。

string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
    directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
    try
    {
        string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
        path = path.Replace("file:", "");
        path = path.Replace("/", "\\");
        directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
    }
    catch (Exception ex)
    {
        directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
    }
}

0

質問が、ClickOnce(true == System.Deployment.ApplicationDeploy.IsNetworkDeployed)アプリケーションがユーザーのPCにインストールされた後のアプリケーションフォルダー内のファイルへのアクセスに関するものであるとすると、アプリケーション自体によってこのフォルダーを取得する3つの方法があります。

String path1 = System.AppDomain.CurrentDomain.BaseDirectory;
String path2 = System.IO.Directory.GetCurrentDirectory();    
String path3 = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; //Remove the last path component, the executing assembly itself.

これらはVS IDEおよび展開/インストールされたClickedOnceアプリから機能し、「true == System.Deployment.ApplicationDeploy.IsNetworkDeployed」チェックは必要ありません。ClickOnceはVisual Studio 2017プロジェクトに含まれるすべてのファイルを取得するため、実際にはアプリケーションは、アプリケーション内からの相対パスを使用して、デプロイされたすべてのファイルにアクセスできます。

これはWindows 10とVisual Studio 2017に基づいています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.