释放对文件的访问权限

时间:2012-01-07 14:03:48

标签: c# io

假设我们有3个进程,它们按顺序写入特定文件,在某些情况下,当进程想要写入进程关闭的文件时(在写入的中间),因此访问另外2个进程的文件是麻烦,我添加了一个控制进程顺序的服务器进程,当进程关闭时会引发一个事件,那么当进程关闭时,如何在此事件中释放源(文件访问)。像File.Release(FilePath);

这样的东西

修改

按以下方式写入文件:

try {
        if(!File.Exists(FilePath))
            throw new Exception("File does not Exist.");

        bool Clear = false;
        using(StreamReader sr = new StreamReader(FilePath)) {
            if(sr.ReadToEnd().Length > 1200)
                Clear = true;
            }

        if(Clear)
            using(StreamWriter sw = new StreamWriter(FilePath, false)) {
                sw.WriteLine(Text);
                sw.Flush();
        } else
            using(StreamWriter sw = new StreamWriter(FilePath, true)) {
                sw.WriteLine(Text);
                sw.Flush();
        }
} catch(Exception ex) {}

1 个答案:

答案 0 :(得分:5)

using System.IO;

class Program
{
    static void Main()
    {
          using (StreamWriter writer = new StreamWriter("important.txt"))
          {
                writer.Write("Word ");
                writer.WriteLine("word 2");
                writer.WriteLine("Line");
          }
    }
}

这是我们在使用时所指的示例类型,关键字“using”。切勿明确关闭streamwriter,也不要明确处理它。使用为你做了所有的魔力。它在工作完成时以及当您使用块时离开时处理。

在多线程环境中,如果你明确地使用close或dispose,那么考虑到线程可能只是尝试打开对象而前一个线程刚刚处理它,线程就会有问题。同步线程时会遇到问题。这与服务器应用程序中通常面临的问题相同,后者具有多个连接到数据库的连接。这就是我们需要像Idisposable一样使用它的原因。

C# USING keyword - when and when not to use it?

这更多地解释了它。

更新:多个客户端同时写入单个文件是您的问题。如上面的人所说,在写入模式下,没有两个进程可以同时保持同一个文件。如果您编写大数据,它必须等待,这个等待时间非常明显,或者您可以从客户端收集对象,对它们进行排队并从服务器实际写入它们。还可以避免对服务器上的文件进行写访问。如果您的数据是序列化的,您可以使用谷歌协议缓冲区来传递数据。

如果您正在从客户端处理该文件,并且如果客户端进程在中途终止,则该文件现在将没有写入句柄,并且很明显,另一个进程可以通过写入获取其上的句柄访问。