3

我有一个程序有两种模式:GUI 和 Just Run。GUI 加载 WPF 表单并让我调整设置,而 Just Run 加载所述设置并......好吧......运行。

它是一种用于批量移动文件的美化、可定制的工具。

问题:“日志”没有完成。程序关闭时它似乎仍在写入,从而切断了日志的结尾。

主要应用程序主体:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        if (!e.Args.Contains("-gui"))
        {
            Process.SettingsPopulate();
            Process.WriteLogHead();
            Process.MoveFiles();
            Process.WriteLogEnd();
        }
        else
        {
            new MainWindow().ShowDialog();
        }
        this.Shutdown();
    }
}

真的很简单。如果命令行有 -gui,它会加载 WPF... 否则它只是运行。

    public static void WriteLogEnd()
    {
        foreach (var log in from i in Items
                            where i.Used == false
                            let build = new StringBuilder()
                            select build.AppendFormat("{0, -12} > {1} > Not Found", _time, i.FileName))
        {
            Logs(log);
        }

        Logs("");
        Logs("Fin.");
    }

Logs 是一种简单的“写入控制台,写入文件”方法。我遍历我的已处理文件列表,查找未使用的项目......也就是“未找到”。在它结束列表并写入 Fin 之前,它会关闭。

有没有让我困惑。如何在 WriteLogEnd 完成之前阻止文件关闭(因为,afaik,无论如何它不应该能够在此之前结束)。

4

2 回答 2

2

在调试器中以命令行模式运行它以查看是否抛出异常,或者在 OnStartup 例程中的代码周围放置 try..catch。

如果在进程的任何线程中未处理异常,则整个进程将突然终止。

还要确保您正在关闭要写入日志的所有文件或流。现在大多数文件 I/O 都是缓冲的,如果你没有正确关闭流,最后一个缓冲区的数据可能不会提交到输出设备。

于 2010-09-28T21:06:20.650 回答
2

Logs 是一种简单的“写入控制台,写入文件”方法。

如果它写入文件,请添加 Logs.Close() 或其他内容。您必须关闭 FileStream 才能刷新其缓存。

于 2010-09-28T21:19:40.197 回答