代码之家  ›  专栏  ›  技术社区  ›  Panzercrisis

如何在C中锁定一个文件,而不使它在第一次被读取后不可修改?

  •  0
  • Panzercrisis  · 技术社区  · 5 年前

    How to lock a file with C#?

    基本上,假设您想要锁定一个JSON文件,读取它,然后写入它,最后解锁它。您可以使用另一个问题的答案锁定文件。

    然而,我遇到了这样的问题:允许我读取文件,但在没有先解锁文件的情况下,不能在之后写入文件。也就是说, 推荐的方法似乎相当受欢迎,它将 相同的 从它自己的资源中 .

    例子:

    using (var fs = new FileStream(GetJsonPath(), FileMode.Open, FileAccess.ReadWrite,
            FileShare.None))
    {
        SomeDtoType dto;
        using (StreamReader reader = new StreamReader(fs))
        {
            dto = ((SomeDtoType)(new JsonSerializer()).Deserialize(reader,
                    typeof(SomeDtoType)));
        }
    
        // Make changes to the DTO.....
    
        using (StreamWriter writer = new StreamWriter(fs))
        {
            new JsonSerializer().Serialize(writer, dto);
        }
    }
    

    using 创建 StreamWriter 引发以下异常:

    流不可写。

    现在我想到的是 FileShare.None . 这里的问题是,这个特定的枚举显然不仅仅是为外部进程设置锁权限。

    如何锁定外部线程/进程以避免更改/删除文件,同时允许自己的线程/进程进行这两个后续的读/写访问?

    编辑:

    很明显所有的东西 使用 StreamReader fs.Position 0 在读和写之间解决了这个问题。这个 fs.位置 部分没问题,但必须将写逻辑移到 使用 ,这样他们就可以使用相同的 FileStream 洛克,看起来有点奇怪。。。

    0 回复  |  直到 5 年前
        1
  •  1
  •   fenixil    5 年前

    StreamReader 如果不使用ctor重载,则关闭流,并指示它不要这样做:

    using (StreamReader reader = new StreamReader(fs, Encoding.UTF8, true, 4096, leaveOpen:true))
    

    StreamReader ,你可以把它搬出去 using 阻塞并保持为未处理状态,但是我建议显式地控制生存期和行为。

    fs.SetLength(0);