その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Windows で flock の LOCK_EX + LOCK_NB のような感じでファイルロックする

"windows LOCK_NB" とかでぐぐると無限に PHP の情報がヒットしてなかなか所望の情報に辿りつけなかったのだけれど,どうやら LockFileEx を使えば良いらしい.
LockFileEx function (Windows)


LOCKFILE_EXCLUSIVE_LOCK (0x00000002) を dwFlags に指定してやるとファイルを排他ロックすることができ (指定しない場合は共有ロック),LOCKFILE_FAIL_IMMEDIATELY (0x00000001) を指定するとロックを取得できなかったら即座に失敗を返してくるようになる (指定しない場合はロックが得られるまで待つ).つまり,これらは flock の LOCK_EX と LOCK_NB に対応していると言える.
つまり,以下のように使うと flock の LOCK_EX | LOCK_NB 相当の事ができる (コードはここから持ってきた:
Locking and Unlocking Byte Ranges in Files (Windows)).

fSuccess = LockFileEx(hFile,         // exclusive access, 
                      LOCKFILE_EXCLUSIVE_LOCK | 
                      LOCKFILE_FAIL_IMMEDIATELY,
                      0,             // reserved, must be zero
                      TESTSTRLEN,    // number of bytes to lock
                      0,
                      &sOverlapped); // contains the file offset


便利便利.