2011-11-08 27 views
0

毎日バックアップスケジュールを実行しています。バックアップファイルが24時間以内に作成されない場合は、新しいバックアップファイルを作成したい(backupdatabase()関数を実行する)。タイマーがC#を使用してファイルを作成していません

さらに、タイマーを使用しているので、1時間ごとにファイルが作成されたかどうかがチェックされます。そして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時間後にファイルを作成できません。

ファイルを作成する方法は、1時間ごとと24時間後にタイマーとともに作成時間を確認する方法ですか?

助けを借りると非常に役に立ちます。

+0

はこの質問では不明であるその後、plsはここにコメントを残して... – rockyashkumar

+0

はい、それはこの機能に入るしない「無効ティック(オブジェクト送信者、ElapsedEventArgs E)」 – rockyashkumar

+0

う:私はあなたがいることを変更することを示唆していますいずれかのplsはこれを助ける... – rockyashkumar

答えて

1

1時間ごとに実行される方法を使用するには、タイマーに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 
} 

しかし、私はあなたが本当に1が作成されていない場合は、単にバックアップを作成するソリューションを達成しようとしているものと考えています24時間以内に。 Form_LoadでBackupIfNecessaryを呼び出すことで、フォームの負荷は、最初にバックアップ機能を実行すると

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)を作成します。これを実現するには、次の使用しますTの内側)

// 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:(あなたが最初の実行のための完全な24時間を待つことはありません)

3)のForm_Loadで24時間タイマー間隔を設定します。

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

になるだろう:それは1

0

が作成されますされていない場合imer_Tickは単に私があなたの主な問題は、このラインであると思いますが、バックアップは、最後の24時間以内に作成されているかどうかを確認しますBackupIfNecessary()を呼び出しますパス情報のないファイル名を付けてください。つまり、 "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(); 
    } 
} 
関連する問題