You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FileShare.None锁定文件时如何实现读取、删除与写入操作?

锁定文件状态下完成读取、修改与写入的解决方案

嘿,这个场景我刚好实操过,咱们结合你的需求一步步来拆解:

首先,你已经用FileShare.None锁定了文件,这一步是对的——它能确保在你操作期间,外部程序完全无法读写这个文件。接下来的核心是在同一个锁定的FileStream实例里完成读、改、写的全流程,避免中途释放锁导致其他程序介入。

关键步骤与代码示例

我用C#给你写个完整的实现,你可以直接参考:

using System.IO;
using System.Linq;

class FileLockEditExample
{
    static void Main()
    {
        string filePath = "your_target_file.txt";
        
        // 用FileAccess.ReadWrite打开流,同时用FileShare.None锁定文件
        using (var fileStream = new FileStream(
            filePath, 
            FileMode.Open, 
            FileAccess.ReadWrite, 
            FileShare.None))
        {
            // 1. 读取文件内容到字符串数组
            var streamReader = new StreamReader(fileStream);
            string allContent = streamReader.ReadToEnd();
            string[] lines = allContent.Split(Environment.NewLine);
            streamReader.Close(); // 关闭Reader,但FileStream依然保持锁定

            // 2. 修改/删除行(这里示例修改第2行,删除包含"要删除的行"的内容)
            // 修改指定行(注意数组索引从0开始)
            if (lines.Length > 1)
            {
                lines[1] = "替换后的新内容";
            }
            // 删除目标行
            lines = lines.Where(line => !line.Contains("要删除的行")).ToArray();

            // 3. 写入修改后的内容并截断文件
            // 将流指针移回文件开头
            fileStream.Seek(0, SeekOrigin.Begin);
            var streamWriter = new StreamWriter(fileStream);
            // 拼接数组并写入
            streamWriter.Write(string.Join(Environment.NewLine, lines));
            streamWriter.Flush(); // 确保内容写入流
            
            // 关键:截断文件到当前写入的位置,避免原文件剩余内容残留
            fileStream.SetLength(fileStream.Position);
        }
        // using块结束后,FileStream自动释放,文件锁定解除
    }
}

几个必须注意的细节

  • 必须用FileAccess.ReadWrite打开流:如果只开了Read权限,后续写入会报错,所以一开始就要申请读写权限。
  • 读取后要重置流位置:StreamReader.ReadToEnd()会把流的指针移到文件末尾,所以写入前一定要用Seek(0, SeekOrigin.Begin)移回开头。
  • 一定要截断文件:如果修改后的内容比原文件短,不截断的话原文件末尾的旧内容会留在文件里,SetLength(fileStream.Position)就是干这个的。
  • 用using管理资源:确保流自动释放,避免因为异常导致文件一直被锁定。

如果你的文件特别大,ReadToEnd()可能会占用太多内存,这时候可以改成逐行读取并临时存储到列表里,逻辑是一样的——只要全程保持FileStream的锁定状态就行。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:22:46