我每天都在做备份时间表。如果在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小时后如何创建文件?
任何帮助都会非常有帮助。
答案 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();
}
}