0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C#】Mutex名にパスは入れられない

Posted at

現象

起動時に外部から読み込むファイルパスごとに重複起動を制御するようなメソッドを作りたい!
→ 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);

解決はしたけど、結局なぜこのエラーを投げるのかはわからず…。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?