使用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小时后如何创建文件?
为了使方法每小时运行一次,您需要为计时器分配一个一小时的间隔。计时器。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();
try
{
// do stuff here
}
catch (whatever exceptions)
{
// notify of exception
}
finally
{
timer.Start();
}
}