Таймер не работает для создания файла с использованием C # - PullRequest
0 голосов
/ 08 ноября 2011

Я делаю расписание резервного копирования каждый день.Если какой-либо файл резервной копии не был создан в течение 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 ]

1 голос
/ 08 ноября 2011

Для того, чтобы метод выполнялся каждый час, вам нужно назначить таймеру интервал в один час.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) Создать новый метод с именем BackupIfNeeded ()

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) Когда ваша форма загружается, выполните функцию резервного копирования в первый раз, выполниввызов BackupIfNe Необходимый в Form_Load (чтобы вы не ждали 24 часа для первого запуска)

3) Установите интервал таймера на 24 часа в Form_Load:

// 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 просто вызывает BackupIfNeeded (), который проверит, была ли резервная копия создана за последние 24 часа, если нет, то создаст одну

0 голосов
/ 08 ноября 2011

Я думаю, что вашей основной проблемой является эта строка:

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...