使用c#创建文件时定时器不工作

本文关键字:定时器 工作 文件 创建 使用 | 更新日期: 2023-09-27 18:13:42

我每天都在做备份。如果24小时内没有创建备份文件,则创建新的备份文件(执行backupdatabase()函数)。

此外,我还使用了一个计时器,这样每隔一小时就会检查文件是否创建。24小时后,它将创建一个新文件(执行backupdatabase()函数)。

文件检查由File.GetcreationTime完成。是否创建文件。

因为我做了这样的事…

public partial class BackupForm : Form
{
    private static System.Timers.Timer _timer;
    private Int32 _hours = 0;
    private const Int32 RUN_AT = 10;
    private void BackupForm_Load(object sender, EventArgs e)
    {
        var today = DateTime.Now;
        _hours = (24 - (DateTime.Now.Hour + 1)) + RUN_AT;
        _timer = new Timer { Interval = _hours * 60 * 60 * 1000 };
        _timer.Elapsed += new ElapsedEventHandler(Tick);
        _timer.Start();
    }
    void Tick(object sender, ElapsedEventArgs e)
    {
        _timer.Stop();
        var name = "localhost";
        const string path = @"C:'Creation'Name'backupdb'";
        var listfiles = Directory.GetFiles(@"C:'Creation'Name'backupdb'", "backup-*.zip").ToList();
        var files = listfiles.Select(Path.GetFileName).ToList();
        var dt = DateTime.Now;
        foreach (var file in files)
        {
            var creationtime = File.GetCreationTime(file);
            var diff = DateTime.Now.Subtract(creationtime);
            if (diff.Hours > 24 && diff.Days < 2 && creationtime.Month == dt.Month && creationtime.Year == dt.Year && name == "localhost" && _hours == 24)
            {
                backupDatabase();
            }
            else if (_hours != 24)
            {
                _hours = 24;
                _timer.Interval = _hours * 60 * 60 * 1000;
            }
        }
        _timer.Start();
    }
}

但是它不工作,它不检查文件创建时间,甚至24小时后也不创建文件。

如何检查文件与创建时间随着计时器每一个小时和24小时后如何创建文件?

使用c#创建文件时定时器不工作

为了使方法每小时运行一次,您需要为计时器分配一个一小时的间隔。计时器。Interval期望以毫秒为单位的值,因此:

// 1000 ms per second, 60 seconds per minute, and 60 minutes per hour
_timer.Interval = 1000 * 60 * 60;

这将使计时器每小时"滴答"。在Timer_Tick函数中,您只需检查最近一小时内的文件日期:

var creationtime = File.GetCreationTime(file);
var diff = DateTime.Now.Subtract(creationtime);
if (diff.TotalHours <= 1)
{
    // File was created within the last hour
}

然而,我相信您真正想要实现的解决方案是,如果24小时内没有创建备份,您只需创建一个备份。要实现这一点,您可以使用以下命令:

1)创建名为BackupIfNecessary()的新方法

private void BackupIfNecessary()
{
    var name = "localhost";
    const string path = @"C:'Creation'Name'backupdb'";
    var listfiles = Directory.GetFiles(@"C:'Creation'Name'backupdb'", "backup-*.zip").ToList();
    var files = listfiles.Select(Path.GetFileName).ToList();
    DateTime lastBackup = DateTime.MinValue;
    foreach (var file in files)
    {
        var creationtime = File.GetCreationTime(file);
        // Check if the creation date for this file is the "latest"
        if (creationtime > lastBackup)
        {
            // Store as the "latest" time
            lastBackup = creationtime;
        }
    }
    var diff = DateTime.Now.Subtract(lastBackup);
    if (diff.TotalHours >= 24)
    {
        // The last backup file was created over 24 hours ago; You should create the file
    }
}

2)当你的表单加载时,通过在Form_Load中调用BackupIfNecessary来第一次执行备份函数(这样你就不用为第一次运行等待整整24小时了)

3)在Form_Load:

中设置24小时的定时器间隔
// 1000 ms per second, 60 seconds per minute, and 60 minutes per hour, and 24 hours per day
_timer.Interval = 1000 * 60 * 60 * 24;

4)内部的Timer_Tick简单地调用BackupIfNecessary(),这将检查是否备份已在过去24小时内创建,如果没有,它将创建一个

我认为你的主要问题是这一行:

var files = listfiles.Select(Path.GetFileName).ToList();

这将给你没有路径信息的文件名。即"backup-x.zip"。然后将该名称传递给File.GetCreationTime。如果程序的当前工作目录不是包含这些文件的目录,File.GetCreationTime将抛出异常,因为它找不到该文件。

您可能需要listfiles的完整路径名。

你永远不会看到异常,因为…

您正在使用System.Timers.Timer,它通过吞下异常来隐藏bug。如果您的Tick事件处理程序抛出异常,它将转义到调用事件处理程序的代码(Timer代码),并将被吞下。你永远不会看到异常。

在你的事件处理程序中,你有:{_timer.Stop ();//做一些事情_timer.End ();}

如果其中的某些内容抛出异常,则事件处理程序将退出而不重新启动计时器。我建议你改一下:

{
    _timer.Stop();
    try
    {
        // do stuff here
    }
    catch (whatever exceptions)
    {
        // notify of exception
    }
    finally
    {
        timer.Start();
    }
}