using System; using System.IO; using System.Threading; using System.Text; using System.Diagnostics; namespace sharp.extensions { public class LockFile { public string LockFileName { get; private set; } public bool IsLocked { get; private set; } public int LockCount { get; private set; } public LockFile(string filename) { this.LockFileName = filename; this.LockCount = 0; } public void Lock() { if (IsLocked){ LockCount++; return; } int retries = 3; Console.WriteLine("wait on lock file {0}", LockFileName); for (; retries > 0; retries--) { while (File.Exists(LockFileName)) { Thread.Sleep(250); } try { FileStream ls = new FileStream(LockFileName, FileMode.CreateNew); byte[] pid = Encoding.UTF8.GetBytes(Process.GetCurrentProcess().Id.ToString()); ls.Write(pid, 0, pid.Length); ls.Close(); IsLocked = true; LockCount = 1; Console.WriteLine("lock acquired"); return; } catch (IOException ioe) { } } ThrowIfUnlocked(); } public void Unlock() { if (IsLocked) { LockCount--; if (LockCount == 0) { File.Delete(LockFileName); IsLocked = false; } } } public void ThrowIfUnlocked(){ if (!IsLocked){ throw new Exception("Lockfile is not locked"); } } } }