現象
起動時に外部から読み込むファイルパスごとに重複起動を制御するようなメソッドを作りたい!
→ System.ThreadingのMutexオブジェクトを生成する際に、第二引数name
に相対パスや絶対パスを含むとエラーとなりました。
コード
public bool IsProcessAlreadyStarted(string mutexName)
{
//Mutex名はプロセス名+引数とする
string currentProcessName = Process.GetCurrentProcess().ProcessName;
string applicationMutexName = currentProcessName + "_" + mutexName;
//Mutexオブジェクトを作成
Mutex mutex = new Mutex(false, applicationMutexName);
bool hasHandleMutex = false;
try
{
//ミューテックスの所有権を要求する
hasHandleMutex = mutex.WaitOne(0, false);
}
catch (AbandonedMutexException)
{
//別のアプリケーションがミューテックスを解放しないで終了した時
hasHandleMutex = true;
}
//ミューテックスを得られた場合は多重起動していない
return !hasHandleMutex;
}
引数mutexNameに".\hoge.txt"
のようにファイルパスを入れるとSystem.IOのエラーが発報されます。
ハンドルされていない例外: System.IO.DirectoryNotFoundException: パス '{プロセス名}_.\hoge.txt' の一部が見つかりませんでした。
Mutex名に絶対パスをそのまま入れてみたりしたけど結果は同様。パスがちゃんと通っているか などは関係ないようです。
どうもバックスラッシュ(\
)が入っているのがダメらしい…?
解決方法
mutexName内のバックスラッシュを適当に置き換えると解決しました。
public bool IsProcessAlreadyStarted(string mutexName)
{
//Mutex名はプロセス名+引数とする
string currentProcessName = Process.GetCurrentProcess().ProcessName;
//バックスラッシュをスラッシュに置き換え
string applicationMutexName = currentProcessName + "_" + mutexName.Replace("\\", "/");
//Mutexオブジェクトを作成
Mutex mutex = new Mutex(false, applicationMutexName);
解決はしたけど、結局なぜこのエラーを投げるのかはわからず…。