c# - 程序停止时如何确保c#完成写入文件?
问题描述
我有一个 ac# 控制台应用程序,它经常快速地将价值 1-2mb 的数据写入文件(不断覆盖同一个文件)。然后我像这样在无限循环中运行程序
@echo off
:while
(
C:\sync.exe
goto :while
)
然后c#写这样的文本
private static async Task WriteFile(string filePath, string text)
{
string base_path = AppDomain.CurrentDomain.BaseDirectory;
string file_path = Path.Combine(base_path, filePath);
using (StreamWriter outputFile = new StreamWriter(file_path))
{
await outputFile.WriteAsync(text);
}
}
但我注意到的是,当我使用 ctrl+c 结束程序或停止调试器时,当它处于写入过程中时,它会停止写入并使文件损坏并丢失数据。
有没有一种方法可以确保如果程序在写入过程中停止,它要么撤消更改(它会覆盖那里的前一个文件),要么再次留下旧文件,或者它以某种方式完成写入(这将花费更少超过一秒钟)?
解决方案
有没有一种方法可以确保如果程序在写入过程中停止,它要么撤消更改(它会覆盖那里的前一个文件),要么再次留下旧文件,或者它以某种方式完成写入(这将花费更少超过一秒钟)?
是的...写入另一个文件。写入完成后,使用该方法的原型复制文件,将Copy
第三个参数设置为true
.
private static async Task WriteFile(string filePath, string text)
{
string temp_file = File.GetTempFileName();
string base_path = AppDomain.CurrentDomain.BaseDirectory;
using (StreamWriter outputFile = new StreamWriter(temp_file))
{
await outputFile.WriteAsync(text);
}
string file_path = Path.Combine(base_path, filePath);
File.Copy(temp_file, file_path, true);
File.Delete(temp_file);
}
推荐阅读
- r - tidyverse 中的分组事件链 ID
- cassandra - 如何在 Cassandra 主键中查找范围?
- amazon-web-services - Fargate 任务的环境变量设置
- php - 如何从供应商文件夹中正确设置配置路径?
- mongoose - Mongoose 聚合匹配字段值等于没有 $expr 的变量?
- node.js - 使用 saml2-js 库从 SAML 请求创建 SAML 响应
- algorithm - 从推荐中删除重复项
- fortify - Big Sur 更新后,Fortify 审计工作台停止工作
- modelica - 在 Dymola 中使用固定步长求解器时如何选择步长?
- php - 文件上传仅适用于 <10Kb 的文件