处理.lock文件

时间:2011-02-10 20:04:04

标签: locking file-access

我们有一个不受我们控制的大型电子商务应用服务器,我们无法以任何形式或形式对其进行修改。此应用程序服务器背后的公司也不会根据客户要求对其进行修改。这是因为他们认为我们是竞争对手,他们不希望客户将我们的应用程序作为其应用程序的前端。

我们的桌面应用程序使用Web服务与此应用程序服务器通信,并且桌面上的每次登录都占用服务器上的用户插槽。应用程序服务器不提供任何功能,使我们能够确定是否采用了用户插槽。最好的解决方案是我们开发一个位于应用服务器和桌面客户端中间的应用程序,该应用程序将管理用户插槽的分配和释放,问题得以解决。由于客户不希望在电子商务应用程序服务器上安装我们的应用程序,因此该解决方案已被拒绝,因为这将使所述电子商务服务器的用户支持无效,另一种选择将是额外的服务器,但这是他们不应该做的事情。我想处理。

这使我们得到的解决方案是我们的桌面应用程序具有对共享文件夹的写入权限。每个桌面应用程序都有一个UID,我们将该UID与用户插槽ID一起使用,并创建一个文件UID.UserSlotId.locked。这意味着每次建立连接时,桌面应用程序都需要检查此共享位置,并确保它们不会使用所采用的UserSlotId。

现在我现在认为锁定文件是一个糟糕的解决方案,但客户已经要求这个,无论我们告诉他们多少这将永远不是一个水密解决方案,他们仍然希望继续。他们假设98%的解决方案是一个很好的解决方案。那么StackOverflow社区可以通过处理这种文件锁定系统的方式提供什么呢?

1 个答案:

答案 0 :(得分:0)

在写入模式下打开锁定文件,并在应用程序使用插槽时保持打开状态。

private static void TakeFistUnusedLock(FileStream[] currentLock)
{
    for (int i = 1; i < 5; i++)
    {
        try
        {
            var fs = File.OpenWrite(Path.Combine(Path.GetTempPath(), "DbLock", i.ToString() + ".lock"));
            currentLock[i - 1] = fs;
            Console.WriteLine("Got lock " + i);
            break;
        }
        catch (Exception) { }
    }
}

我像这样测试了

FileStream[] currentLock = new FileStream[5];
var path = Path.Combine(Path.GetTempPath(), "DbLock");
DirectoryInfo di = new DirectoryInfo(path);
di.Create();


TakeFistUnusedLock(currentLock);
TakeFistUnusedLock(currentLock);
TakeFistUnusedLock(currentLock);

currentLock[1].Dispose(); // release lock 2

TakeFistUnusedLock(currentLock);

输出

Got lock 1
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
Got lock 2
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
Got lock 3
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
Got lock 2

不是保留currentLock数组,而是每个应用程序只存储一个锁。您需要存储打开的FileStream以确保文件在写入模式下保持打开状态。要释放锁定,您将释放存储的FileStream,然后释放文件上的写锁定 此方法可确保即使应用程序崩溃也会释放锁定。