1. ホーム
  2. .net

[解決済み] .NETでファイルのロックが解除されるまで待つ

2022-11-01 13:14:52

質問

ファイルがロック解除され、読み取りと名前の変更が可能になるまで、スレッドをブロックする最も簡単な方法は何ですか? たとえば、.NET Framework のどこかに WaitOnFile() があるのでしょうか?

FileSystemWatcher を使用して、FTP サイトに転送されるファイルを探すサービスがありますが ファイルが作成されました。 イベントは、他のプロセスがファイルの書き込みを完了する前に発生します。

理想的なソリューションは、スレッドがあきらめる前に永遠にハングアップしないように、タイムアウト期間を設けることです。

編集: 以下の解決策をいくつか試した後、私は最終的に システム に書き込むようにしました。 Path.GetTempFileName() に書き込むようにし、次に File.Move() を実行し、最終地点へ。と同時に FileSystemWatcher イベントが発生した時点で、ファイルはすでに完成していました。

どのように解決するのですか?

これは、私が 関連の質問 :

    /// <summary>
    /// Blocks until the file is not locked any more.
    /// </summary>
    /// <param name="fullPath"></param>
    bool WaitForFile(string fullPath)
    {
        int numTries = 0;
        while (true)
        {
            ++numTries;
            try
            {
                // Attempt to open the file exclusively.
                using (FileStream fs = new FileStream(fullPath,
                    FileMode.Open, FileAccess.ReadWrite, 
                    FileShare.None, 100))
                {
                    fs.ReadByte();

                    // If we got this far the file is ready
                    break;
                }
            }
            catch (Exception ex)
            {
                Log.LogWarning(
                   "WaitForFile {0} failed to get an exclusive lock: {1}", 
                    fullPath, ex.ToString());

                if (numTries > 10)
                {
                    Log.LogWarning(
                        "WaitForFile {0} giving up after 10 tries", 
                        fullPath);
                    return false;
                }

                // Wait for the lock to be released
                System.Threading.Thread.Sleep(500);
            }
        }

        Log.LogTrace("WaitForFile {0} returning true after {1} tries",
            fullPath, numTries);
        return true;
    }