13

ファイルがいつ作成されたかを取得する必要があります-次を使用してみました:

FileInfo fi = new FileInfo(FilePath);
var creationTime = fi.CreationTimeUtc;

var creationTime = File.GetCreationTimeUtc(FilePath);

どちらの方法も通常、間違った作成時間を返します - どこかにキャッシュされていると思います。

ファイルは削除され、同じ名前で再作成されます。いつ再作成されたかを知る必要があります (作成された日付/時刻が変更されたかどうかを確認することにより)-ファイルを確認してこれを行う予定でした作成時間は変更されましたが、これは不正確であることがわかりました。

Win 7 で作業していますが、ファイル エクスプローラーを確認すると、新しいファイルの作成時間が正しく表示されます。

FileSystemWatcher も使用してみましたが、私のユースケースでは完全には機能しません。たとえば、プログラムが実行されていない場合、FileSystemWatcher は実行されていないため、プログラムが再起動したときに、ファイルが削除されて再作成されたかどうかはわかりません。

MSDN http://msdn.microsoft.com/en-us/library/system.io.file.getcreationtime.aspxを見たことがあります。

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

しかし、別の提案を使用して、新しいファイルを作成した後に SetCreationDate を設定しようとしましたが、これが機能しないこともわかりました。以下のテストを参照してください。

    [Test]
    public void FileDateTimeCreatedTest()
    {
        var binPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
        var fullFilePath = Path.Combine(binPath, "Resources", "FileCreatedDatetimeTest.txt");
        var fullFilePathUri = new Uri(fullFilePath);


        var dateFormatted = "2013-08-17T15:31:29.0000000Z"; // this is a UTC string
        DateTime expectedResult = DateTime.MinValue;
        if (DateTime.TryParseExact(dateFormatted, "o", CultureInfo.InvariantCulture,
            DateTimeStyles.AssumeUniversal, out expectedResult)) // we expect the saved datetime to be in UTC.
        {

        }

        File.Create(fullFilePathUri.LocalPath);
        Thread.Sleep(1000); // give the file creation a chance to release any lock

        File.SetCreationTimeUtc(fullFilePathUri.LocalPath, expectedResult); // physically check what time this puts on the file. It should get the local time 16:31:29 local
        Thread.Sleep(2000);
        var actualUtcTimeFromFile = File.GetCreationTimeUtc(fullFilePathUri.LocalPath);

        Assert.AreEqual(expectedResult.ToUniversalTime(), actualUtcTimeFromFile.ToUniversalTime());

        // clean up
        if (File.Exists(fullFilePathUri.LocalPath))
            File.Delete(fullFilePathUri.LocalPath);
    }

どんな助けでも大歓迎です。

4

4 に答える 4

10

使用する必要がありますRefresh

FileSystemInfo.Refresh は、現在のファイル システムからファイルのスナップショットを取得します。ファイル システムが誤った情報や古い情報を返した場合でも、更新では基になるファイル システムを修正できません。これは、Windows 98 などのプラットフォームで発生する可能性があります。

属性情報を取得する前に Refresh を呼び出す必要があります。そうしないと、情報が古くなります。

MSDN からのキー ビットは、スナップショット属性情報を取得することを示しています。

于 2013-08-20T15:58:00.323 に答える
4

使ってみてFileInfo、それの更新方法

fileInfo.Refresh();
var created = fileInfo.CreationTime;

これはうまくいくはずです

于 2013-08-20T15:57:54.463 に答える
0
 File.Create(fullFilePathUri.LocalPath);
 Thread.Sleep(1000); // give the file creation a chance to release any lock

それはあなたのやり方ではありません。File.Create は、待機せずにロックを解放するために閉じる必要があるストリーム ライターを作成します。Thread.Sleep を使用していると、何か間違ったことをしていることに気付くことがよくあります。

于 2014-08-13T11:24:10.263 に答える