锁定文件以防止多个用户访问它的最佳方法是啥

Posted

技术标签:

【中文标题】锁定文件以防止多个用户访问它的最佳方法是啥【英文标题】:What is the best way to lock a file to prevent multiple users from accessing it锁定文件以防止多个用户访问它的最佳方法是什么 【发布时间】:2012-11-30 08:56:49 【问题描述】:

我有一个 Windows 窗体应用程序,用户可以在其中打开、创建和保存 xml 文件。文件通常保存到网络文件夹。我需要确保给定文件一次只能由一个用户打开。 xml 文件被加载到树控件中,并在会话期间经常保存。 (几乎任何时候点击树节点) 我打开文件是这样的:

FileStream fs = new FileStream(m_Filename, FileMode.Open);
XmlReader reader = new XmlTextReader(fs);
XmlSerializer deserializer = new XmlSerializer(typeof(BaseBoardTest));
m_TestNodes = (BaseBoardTest)deserializer.Deserialize(reader);
fs.Close();

像这样保存:

TextWriter writer = new StreamWriter(filename);
XmlSerializer serializer = new XmlSerializer(typeof(BaseBoardTest));
serializer.Serialize(writer, m_TestNodes);
writer.Close();

如果其他用户尝试打开文件或通过另存为覆盖文件,我想显示一条消息,说明哪个用户/计算机名称打开了文件。 我正在考虑在打开文件时创建一个锁定文件。 有没有更好的方法来处理这个问题?

【问题讨论】:

完成后关闭文件怎么样? 可能重复:***.com/questions/1304/… 【参考方案1】:

如果您想阻止用户在其他用户打开文件时打开该文件,则需要FileShare.None 枚举。

你应该替换

new FileStream(m_Filename, FileMode.Open);

new FileStream(m_Filename, FileMode.Open, FileAccess.ReadWrite, FileShare.None)

关于 FileShare.None 的更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

注意:请务必捕获尝试打开文件时引发的任何异常。如果一个用户打开了文件,那么任何后续打开文件的请求都会引发System.IO.IOException,直到文件被关闭。

【讨论】:

【参考方案2】:

你可以通过只锁定写访问来处理这个问题,从而允许其他人仍然读取文件:

using (FileStream fs = new FileStream(m_Filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read))

   XmlReader reader = new XmlTextReader(fs);
   XmlSerializer deserializer = new XmlSerializer(typeof(BaseBoardTest));
   m_TestNodes = (BaseBoardTest)deserializer.Deserialize(reader);
   fs.Close();

   TextWriter writer = new StreamWriter(filename);
   XmlSerializer serializer = new XmlSerializer(typeof(BaseBoardTest));
   serializer.Serialize(writer, m_TestNodes);
   writer.Close();

【讨论】:

【参考方案3】:

这是来自同步记录器功能的 sn-p。在写入完成并且是线程安全的之前,它是不可访问的。

internal class WriteToLockedFile
    
        internal static string Uri  get; set ; 
        private static readonly object _syncObject = new object();

        public static void WriteToFile(string logMessage)
        
            using (var stream = TextWriter.Synchronized( File.AppendText(Uri)))
            
                lock (_syncObject) 
                
                    stream.WriteLine(" 0", logMessage); stream.Flush(); 
                
            
        
    

【讨论】:

【参考方案4】:

如果您想显示其他信息,锁定文件将是唯一的方法。

【讨论】:

是的,让用户知道谁打开了文件会很有价值。

以上是关于锁定文件以防止多个用户访问它的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何锁定文件以防止读取/写入同一文件的多个 ajax 请求?

防止机器人向您的博客发送垃圾邮件的最佳方法是啥?

使用 Visual Studio,如何防止网络共享上的发布项目被用户锁定?

Windows.alert() 防止访问/数据进入电子反应应用程序中的文本输入字段。处理 windows.alert 的最佳方法是啥?

获取站点访问者位置的最佳方法是啥? [关闭]

存储用户 ID 的最佳解决方案是啥?