プロが教えるわが家の防犯対策術!

C# でファイルのタイムスタンプの比較

public class FileList
{
 long size;
 DateTime time;
 string name;
   :
があり、このクラスのファイルを比較するメソッドcmpを作りました。

private int cmp(FileList f)
{
 return (
  (f.size < this.size) ? -1 :
  (f.size > this.size) ? 1 :
  (f.time > this.time) ? -1 :
  (f.time < this.time) ? 1 :
  this.name.CompareTo(f.name));
}

しかし、USBメモリにコピーしたファイルの中に、同一と判断されないファイルが出てしまいます。原因を調べたら、USBメモリにコピーするときにタイムスタンプが変更するためとわかりました。

http://support.microsoft.com/kb/402160/ja
「奇数秒に作成されたファイルを NTFS パーティションから FAT パーティションにコピーすると、作成日時の繰り上げが発生します。」という記載があり、原因はわかりました。

しかし、後半には、「NTFS ドライブと FAT ドライブ上のファイルのタイムスタンプを比較する場合は、この動作を考慮する必要があります。 」とだけ記載がありますが、具体的に、プログラムで、どのように考慮したらよいのかわかりません。「2秒以内なら同じとみなす」といった処理をすればよい事はわかりますが、ここで詰まっています。ご教示お願いします。

A 回答 (2件)

DateTime型を減算するとTimeSpan型で戻ってくるので、


http://msdn.microsoft.com/ja-jp/library/1905yhe2 …

その中のTotalSecondsを見ればいいでしょう。
http://msdn.microsoft.com/ja-jp/library/system.t …

NTFSとFATの「同じファイル」の比較なら、NTFS→FATコピー時には繰り上げしか発生しないので、実際には「FAT - 2 <= NTFS <= FAT」の場合に同値と看做す、という手法になるかと思います。
    • good
    • 0
この回答へのお礼

再度応答、ありがとうございます。
つまり、
 ((f.time - this.time).TotalSeconds > 2) ? -1 :
 ((f.time - this.time).TotalSeconds < -2) ? 1 :
ですね。
どちらがFATか不明なので、とりあえず±2秒以内なら同じとみなして、問題なさそうです。ありがとうございました。

お礼日時:2010/06/02 15:03

「timeの差が±2秒以内なら」と考えれば条件式が見えてきませんか?

    • good
    • 0
この回答へのお礼

応答ありがとうございます。
つまり、
(f.time - this.time > 2秒) ? -1 :
(f.time - this.time < -2秒) ? 1 :
ですよね。でも、どのように記述するのか、よくわからないんです。
さらには、本当に「2秒誤差で判断して大丈夫」、同一ファイルが異なると判断されることが本当にないのか? についても回答がほしいです。
更なる、ご教示お願いします。

お礼日時:2010/06/02 11:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!