使用C#创建文件时,计时器无效

时间:2011-11-08 10:14:49

标签: c# .net windows winforms timer

我每天都在做备份时间表。如果在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小时后如何创建文件?

任何帮助都会非常有帮助。

2 个答案:

答案 0 :(得分:1)

为了拥有一个每小时运行一次的方法,您需要为计时器分配一个小时的间隔。 Timer.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小时内创建了备份,如果没有,则会创建一个

答案 1 :(得分:0)

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

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

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

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

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

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

在您的事件处理程序中,您有:     {         _timer.Stop();         //做一堆东西         _timer.End();     }

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

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