1

私のアプリケーションは、共有ネットワーク ドライブに新しいバージョンのファイルがあるかどうかを起動時にチェックします。ネットワーク共有上の方が新しい場合は、それをローカル アプリケーション ディレクトリにコピーし、古いものを上書きします。これを行うための現在のコードは次のようになります。

FileInfo sourceFile = new FileInfo(source + "\\" + fileName);
if(sourceFile.Exists) {
    FileInfo destFile = new FileInfo(destination + "\\" + fileName);
    if (destFile.Exists && destFile.LastWriteTime >= sourceFile.LastWriteTime)
    {
        //Using log4net
        log.Info("Current " + fileName + " is newer than the one on the server.");
        return false;
    }
}

ログを確認するLastWriteTimeと、ソース ファイルの が新しいものとして検出されない場合があるようです (ある場合のイベント)。書き込み時間と変更時間が混乱している可能性がありますか? これを達成する方法を知っている人はいますか?

編集(および以下の私のコメントのコピー):私がコピーしているファイルは、ほとんどが私が制御できるDLLファイルです。これらはアプリケーション「Growl for Windows」のアセンブリです。カスタム表示を定義します。私のアプリケーションの目的は、ネットワーク共有をチェックして、利用可能な新しいバージョンがあるかどうかを確認し、必要に応じてそれをローカルにコピーすることです。そうすることで、すべてのクライアントが最新のディスプレイを使用していることを確認できます。

編集2:

OK、アセンブリのロードをいじって、別の問題に遭遇しました。経由でロードした場合、場所が異なっていても、同じファイルを2回ロードできないようですAssembly.ReflectionOnlyLoadFrom

4

2 に答える 2

1

LastWriteTimeのドキュメントでは、返される値が正確でない可能性があることに注意してください。メソッドに関するコメントにも注意してください。Refresh上記のコードでは、これを呼び出す必要はほとんどありませんが、FileInfo オブジェクトを作成し、それらを一定時間保持している場合は、これが適用される可能性があります。

Windows は、ファイルの実際の最終書き込み時刻の更新を遅らせることができます。これがどれくらい遅れるかについては、ファイル情報を扱う Windows API 呼び出しを確認してください。

于 2010-07-22T01:38:07.447 に答える
1

MSDNによると:

このメソッドは、値がオペレーティング システムによって継続的に更新されない可能性があるネイティブ関数を使用するため、不正確な値を返す可能性があります。

可能であれば、次のいずれかを試します。

  • ファイル名に日付を埋め込む
  • ファイルの内容にファイルのバージョンまたは日付を格納します。

LastWriteTimeそうすれば、プロパティに関連する問題について心配する必要はありません。

于 2010-07-22T01:40:12.950 に答える