【问题标题】:Releasing access to files释放对文件的访问权限
【发布时间】:2012-01-07 14:03:47
【问题描述】:

假设我们有 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) {}

【问题讨论】:

  • 向我们展示写入文件的代码。基本上,当您写入文件时,您会打开具有写入访问权限的该文件的句柄。没有其他人可以写入该文件。但是一旦你写完,你应该释放句柄(通常通过调用 Dispose 或 Close 或将代码放入 using 块)。
  • @oleksii 查看我更新它的问题。
  • 正如 Oleksii 所说,使用关键字“使用”。它隐含的意思是 Idisposable 它将维护句柄并在工作完成时将其处置。这是最好的做法。它的使用方式与用于数据库连接的方式相同。
  • 如果您使用的是 using 块,则不必致电 sw.Close() 或 sw.Dispose()。
  • @Saeid - 它不应该导致您描述的行为。这是不必要的,因为 using 块会为您完成。

标签: c# io


【解决方案1】:
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");
          }
    }
}

这是我们说 use 时的示例类型,关键字“using”。永远不要显式关闭流写入器,也不要显式处理它。 using 为你做了所有的魔法。它会在工作完成以及您退出此 using 块时进行处理。

在多线程环境中,如果您显式使用 close 或 dispose,则线程将出现问题,因为线程可能只是尝试打开对象,而前一个线程刚刚释放它。您将在同步线程时遇到问题。这与在数据库中运行多个连接的服务器应用程序中通常面临的问题相同。这就是我们需要将它与 Idisposable 一起使用的原因。

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

这解释了更多。

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

如果您正在处理来自客户端的文件,并且如果客户端进程在中途终止,那么现在将没有文件的写句柄,显然它可以让另一个进程通过 write 获取它的句柄访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多