什么是防止多个用户访问文件的最佳方式?

3

我有一个 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();

如果另一个用户试图打开文件或通过“另存为”覆盖文件,我希望显示一条消息,指出哪个用户/计算机名已经打开了该文件。 当文件被打开时,我考虑创建一个锁定文件。 有更好的方法来处理这个问题吗?


1
你完成操作后再关闭文件怎么样? - Ohad Schneider
可能是重复的问题:https://dev59.com/EnVD5IYBdhLWcg3wXaid - lsoliveira
4个回答

2

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


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

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,直到该文件被关闭。


0

您可以通过仅锁定写入访问权限来处理该问题,从而允许其他人仍然读取文件:

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();
}

0
这是同步记录器功能的片段。在写操作完成并且线程安全之前,它是不可访问的。
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(); 
                }
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接