79 lines
1.3 KiB
C#
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");
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|