首页 > 解决方案 > 程序停止时如何确保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 结束程序或停止调试器时,当它处于写入过程中时,它会停止写入并使文件损坏并丢失数据。

有没有一种方法可以确保如果程序在写入过程中停止,它要么撤消更改(它会覆盖那里的前一个文件),要么再次留下旧文件,或者它以某种方式完成写入(这将花费更少超过一秒钟)?

标签: c#file-writing

解决方案


有没有一种方法可以确保如果程序在写入过程中停止,它要么撤消更改(它会覆盖那里的前一个文件),要么再次留下旧文件,或者它以某种方式完成写入(这将花费更少超过一秒钟)?

是的...写入另一个文件。写入完成后,使用该方法的原型复制文件,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);
}

推荐阅读