C# - 锁定文件,直到浏览器关闭,用户离开页面或会话过期

时间:2009-12-10 15:50:03

标签: c# asp.net file-io filelock

在浏览器关闭,用户离开当前页面或会话过期之前,有没有办法锁定文件?

我有一个java应用程序,它从文本文件中读取注释,并允许用户通过Java应用程序修改或添加更多注释到pdf。完成后,单击“保存”,完整的注释文件将返回到原始数据文件。

问题是2个人可以打开相同的注释文件并执行不同的更新。然后,当每次保存时,它们会覆盖现有文件,以便仅保存第二个用户的更改。

理想的解决方案是让1人'签出'文件进行编辑,进行修改,直到他们关闭窗口,离开页面或者会话过期,然后文件会自动“检查 - 在'。在C#中这样做的任何方式?谢谢!

5 个答案:

答案 0 :(得分:0)

没有简单的内置方法可以做到这一点,你可以做的是在与注释文件夹相同的文件夹中创建一个{username} .lock文件。然后在阅读或保存之前检查目录中是否有.lock文件。

如果有文件告诉用户它已被锁定且无法更新。显然你需要确保删除.lock文件,否则在第一次访问后,任何人都无法访问注释文件。

答案 1 :(得分:0)

您可以将锁定代码放在Session_Start和您的发布代码中,放在Global.asax文件的Session_End方法中。但是,尝试确定用户何时确实离开会话以便在不等待会话超时的情况下触发这些事件很难检测,但可以通过AJAX和一些Javascript来完成。

示例

protected void Application_Start()
{
    Application("AnnotationFileLocked") = False;
}
...

protected void Session_End()
{
    if ((bool)Application("AnnotationFileLocked"))
    {
         // Session("UserName") could be set on Login
         if ((string)Application("AnnotationFileLockedBy") == (string)Session("UserName"))
         {
             Application("AnnotationFileLocked") = False;
             Application.Remove("AnnotationFileLockedBy");
         }
    }
}

然后在您的代码中的任何位置查看文件:

public void CheckOutFile()
{
    if (!(bool)Application("AnnotationFileLocked"))
    {
        Application("AnnotationFileLocked") = True
        Application("AnnotationFileLockedBy") = (string)Session("UserName");
        // do stuff
    }
}

答案 2 :(得分:0)

如果能够编辑的两个用户是应用程序的工作方式,那么为每个用户编辑该文件的临时副本以进行编辑是否更有意义呢?

答案 3 :(得分:0)

这样的锁是没有好办法的。虽然您可以将代码放入Session_End来清理锁,但不保证会触发该事件。例如,服务器可能在会话期间崩溃。你将留下一个永久锁定的文件。

由于您需要简单性,因此可以考虑使用基于超时的锁定。当用户A开始编辑文件时,他们可以独立访问该文件60分钟(或您选择的任何范围)。您在数据存储中放入一个条目,表示最近的编辑锁定用于用户A,并在下午12:42到期。用户A可以在那段时间内编辑他喜欢的内容。如果他之前完成,他可以单击“完成”按钮,删除锁定条目。您甚至可以给他一个“更多时间”按钮,将锁定到期时间戳更新为60分钟。

如果用户B出现并尝试编辑该文件,您的应用会检查该列表,并看到此文件已被锁定,直到今天下午12:42。如果用户A离开并且永远不会完成,或者保存并忘记解锁,或者应用程序崩溃,则无需担心解锁或清理。用户B只需要等到12:42,然后您的应用将忽略现有的锁定条目,因为它已过期。

很多维基使用类似的方法。它可能并不完美,但用户很容易理解,也不需要任何操作员维护。

答案 4 :(得分:0)

您可以使用我的库访问多个应用程序中的文件。

您可以从nuget安装它:Install-Package Xabe.FileLock

如果您想了解更多相关信息,请查看 https://github.com/tomaszzmuda/Xabe.FileLock

ILock fileLock = new FileLock(file);
if(fileLock.Acquire(TimeSpan.FromSeconds(15), true))
{
    using(fileLock)
    {
        // file operations here
    }
}
仅当可以锁定此对象的独占文件时,

fileLock.Acquire方法才会返回true。 但是上传文件的app也必须在文件锁中做。 如果对象不可访问,则metod返回false。

因此,如果您想使用它,您可以在第一个用户打开文件时创建锁定,以便在会话过期或用户更改页面后进行编辑和处理。