使用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
相关产品推荐
相关产品推荐

