跨网络文件锁定.Net

时间:2013-08-08 19:11:39

标签: c# .net file locking

我之前在Stack上看过几个类似的问题,但似乎没有任何东西符合我的需求。

我有一个简单的场景。一个流式传输pdf文件的网页,但是每隔一段时间就会更新同一个pdf文件的单独服务。我已经写了网站和服务器,所以我可以做任何需要做的事情。

该服务实际上完成了对临时文件所需的所有操作,然后在最后它将临时文件替换或移动到最终的pdf位置。

我的想法是使用一个命名的互斥锁,但该服务会生成大量的pdf文件,所以我不希望所有的pdf文件都被锁定,因为我正在编写一个特定的pdf文件。我认为为每个pdf文件都有一个命名的互斥锁是不切实际的。

这似乎应该很简单。我错过了什么?关于如何控制对每个pdf文件的访问权限的建议,以便网页在服务尝试覆盖它的同一时间不尝试流式传输它?日志显示每天都会发生这种情况。

2 个答案:

答案 0 :(得分:0)

我会对PDF进行版本化。

假设您有一个要传输的文件FOO.PDF。它的实际名称是FOO.1.PDF。当用户请求FOO.PDF时,Web服务器会获取目录中与“FOO。*。PDF”匹配的所有文件的列表,并选择编号最大的文件。

上传文件时,上传到临时文件,然后为“FOO。*。PDF”创建目录,获取最高版本号,将其递增1,然后重命名临时文件。所以下次客户想要FOO.PDF时,他会找到FOO.2.PDF。

这完全消除了任何共享或锁定问题。但是,您必须不时清理目录以删除过时的版本。

答案 1 :(得分:0)

这是我尝试过的,到目前为止看起来效果还不错:

string mutexName = String.Format(@"Global\{0}", caseId.ToString());
Mutex mutex;
if (!Mutex.TryOpenExisting(mutexName, out mutex))
{
     bool isNew;
     MutexSecurity mSec = new MutexSecurity();
     SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
     MutexAccessRule rule = new MutexAccessRule(sid, MutexRights.FullControl, AccessControlType.Allow);

      mSec.AddAccessRule(rule);
      mutex = new Mutex(false, mutexName, out isNew, mSec);
}
if (mutex.WaitOne(5000))
{
     try
     {
          // read/write/modify the file
     }
     finally 
     {
          mutex.ReleaseMutex();
     }
}
else
{
     Common.LogInfoMessage(String.Format("Timed out waiting for pdf mutex. CaseId: {0}", caseId));
}

由于2个进程在不同的用户帐户下运行,我必须传入MutexSecurity对象。在这种情况下,我只是让每个人都可以访问它,但如果我想进一步限制它,我只能给2个帐户访问它。另外,请确保将名称设为全局...最初没有这样做。

要运行这几天,看看日志说的是什么。我虽然感觉很好。