如何用StreamReader检查TimeSpan后再用StreamWriter写入文件?
嘿,我明白你卡在哪了——StreamReader和StreamWriter配合的时候,很容易在文件打开/关闭、资源释放上出问题,尤其是还要加检查重复的逻辑。我给你整理一套清晰的实现方案,一步步来:
核心思路与代码实现
你的需求本质是先校验、后写入:先读取目标文件内容,检查是否已存在当前TimeSpan的拼接值,只有不存在时才执行写入操作。下面以C#为例给出具体实现:
1. 生成要校验的TimeSpan拼接字符串
首先把你的TimeSpan对象转换成需要检查的字符串格式:
// 假设ts是你获取到的TimeSpan实例,比如当前时间的时分秒 TimeSpan ts = DateTime.Now.TimeOfDay; string targetTsStr = $"{ts.Hours}{ts.Minutes}{ts.Seconds}";
2. 读取文件并检查重复记录
这里要处理文件不存在的情况,同时用using语句自动释放文件资源,避免锁定:
bool isRecordExists = false; string targetFilePath = "你的目标文件路径.txt"; // 先判断文件是否存在,不存在则直接标记为无重复 if (File.Exists(targetFilePath)) { using (StreamReader reader = new StreamReader(targetFilePath)) { // 小文件用ReadToEnd()一次性读取,大文件推荐逐行读取(注释部分) string fullContent = reader.ReadToEnd(); isRecordExists = fullContent.Contains(targetTsStr); // 大文件逐行读取优化: // string line; // while ((line = reader.ReadLine()) != null) // { // if (line.Contains(targetTsStr)) // { // isRecordExists = true; // break; // 找到匹配项就停止读取,提升性能 // } // } } }
3. 无重复则执行写入操作
确认没有重复记录后,用StreamWriter追加写入内容,同样用using保证资源释放:
if (!isRecordExists) { // 使用AppendText模式:文件不存在自动创建,存在则在末尾追加内容 using (StreamWriter writer = File.AppendText(targetFilePath)) { // 写入你需要的内容,这里示例同时写入TimeSpan值和触发的关键词 writer.WriteLine($"[{targetTsStr}] 触发关键词:XXX"); // 如果只需要写入TimeSpan拼接值,直接写:writer.WriteLine(targetTsStr); } }
关键注意事项
- 资源释放:必须用
using包裹StreamReader和StreamWriter,它会自动帮你关闭文件、释放句柄,避免文件被锁定无法再次操作。 - 编码适配:如果你的文件有特定编码(比如UTF-8带BOM),创建流时可以指定编码,例如
new StreamReader(targetFilePath, Encoding.UTF8)。 - 并发安全:如果程序有多线程同时操作这个文件,需要添加锁机制(比如
lock语句),或者改用File.AppendAllText这类自带同步的方法,避免写入冲突。
内容的提问来源于stack exchange,提问作者user9310993
相关产品推荐
相关产品推荐

