RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

(C#)AppData内の設定ファイルの保存先

作ったもの

 ウィンドウの位置、最終起動時刻、最近使ったファイルなど、設定データを保存する際は、AppData\Local\[会社名]\[アプリケーション名] に保存するのが望ましいです。そのフォルダパスを取得するコードを紹介します。

前提

import System.Reflection;

コード

/// <summary>
/// AppData\Localの中にある設定保存用のディレクトリを取得します。
/// [ユーザー名]\AppData\Local\[会社名]\[アプリケーション名]
/// 会社名が設定されていない場合は "Default" になります。
/// </summary>
static private string LocalAppData{
	get {
		Func<string, bool> nameHasForbiddenChar = (str) => {
			foreach (var each in "\\/:*?\"<>|") {
				if (str.Contains(each + "")) {
					return true;
				}
			}
			return false;
		};
		Assembly asm = Assembly.GetExecutingAssembly();
		string asmName = asm.GetName().Name;
		Attribute customAttr = Attribute.GetCustomAttribute(asm, typeof(AssemblyCompanyAttribute));
		string company = (customAttr as AssemblyCompanyAttribute).Company;
		if (company.Length == 0 || nameHasForbiddenChar(company)) {
			company = "Default";
		}
		string path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
		return path + "\\" + company + "\\" + asmName;
	}
}

使い方

// s : C:\Users\[ユーザー名]\AppData\Local\[会社名]\[アプリケーション名]
string s = LocalAppData;

説明

 設定データの置き場所は、いくつかの候補があります。
①実行ファイル(.exe)と同じ場所
②USER\[ユーザー名]\AppData\Local\[会社名]\[アプリケーション名]
③USER\[ユーザー名]\AppData\Roaming\[会社名]\[アプリケーション名]
④その他(マイドキュメントなど)
 Windows 95/98の頃には、①が多かったのですが、Windows Vista の頃から管理者権限のフォルダにあるEXEを実行すると、複数ユーザーの設定が保存できない問題や、権限不足で設定データを書き込めなくなる問題が出てきました。そのため、2019年の時点では②や③が主流となっています。
 Roamingは、同じユーザーが他のコンピューターを使っても同じデータを引き継ぐ必要があるときに使用します。普段はLocalで良いでしょう。