sharp-extensions/LockFile.cs

79 lines
1.3 KiB
C#

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");
}
}
}
}