我有一个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();
我想显示一条消息,说明如果其他用户尝试打开文件或通过另存为覆盖文件,则打开文件的用户/计算机名称。 我正在考虑在打开文件时创建一个锁文件。 有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
如果您想显示其他信息,锁定文件将是唯一的方法。
答案 1 :(得分: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 :(得分: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();
}
答案 3 :(得分: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();
}
}
}
}