如何以最少的锁定访问文件

时间:2008-10-23 11:48:43

标签: c# file locking io

在我的应用程序(c#3.5)中,有很多进程非常频繁地访问单个xml文件(读取和写入)。访问该文件的代码放在由很多其他应用程序引用的程序集中。例如,Windows服务可能会实现MyFileReaderWriter类(在前面提到的程序集中定位)并使用此类的读/写方法。

我正在寻找以最少的锁定来读取和创建/附加文件的最佳/最快方式。

表示,定期缓存文件数据和刷新新内容不是一种选择。

我忘了提到我目前使用XDocument(LInq2Xml基础设施)来读取/写入文件内容。

3 个答案:

答案 0 :(得分:4)

如果通过写信你只是附加到文档,那么试试这个

http://msdn.microsoft.com/en-us/library/aa302289.aspx

基本上你的xml文档是一个带有开始和结束标记的shell。标签之间是一个include引用,它引用另一个文件,另一个文件是xml文档的主体。 对于写入操作,这要快很多倍,因为每次写入时都不必加载xml文件,并且每次都不写入整个文件。

使用XmlWriter类,您可以非常轻松地将节点附加到正文文件的末尾。

当其他人想要阅读xml时,他们只需打开文档,他们的xml解析器“知道”加载和解析这两个文件。

希望这有帮助。

答案 1 :(得分:3)

首先,确保通过单个实例完成对XML文档的所有访问。

然后在访问它的函数的开头放置一个锁定机制(等待解锁)并在最后解锁它。

答案 2 :(得分:1)

您的意思是数据至关重要? XML文件不是您的应用程序专门使用的吗?

简单(并且可能足够好)锁定对文件的IO访问的方法是创建一个静态工厂类,它提供“读写令牌”对象,每个I / O操作都必须锁定。

public static object GetReadWriteToken(String fileName)
{
    //use a hashtable to retreive an object, with filename as key
    return token;
}

只需在阅读和写作时这样做:

lock(GetReadWriteToken(@"C:\important.xml"))
{
    //io code
}