Время создания файла в С#

Мне нужно получить, когда был создан файл - я попытался использовать:

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

и

var creationTime = File.GetCreationTimeUtc(FilePath);

Оба метода обычно возвращают неправильное время создания - я думаю, что он где-то кэшируется.

Файл удаляется и воссоздается с тем же именем, и мне нужно знать, когда/если оно было заново создано (проверяя, изменилась ли дата/время создания) - я планировал сделать это, увидев это изменило время создания файла, но я обнаружил, что это неточно.

Я работаю над Win 7, и если я проверю File Explorer, он покажет новое время создания файла.

Я также пытался использовать 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);
    }

Любая помощь очень ценится.

Ответ 1

Вам нужно использовать Refresh:

FileSystemInfo.Refresh принимает моментальный снимок файла с текущего файловая система. Обновление не может исправить основную файловую систему, даже если файловая система возвращает неверную или устаревшую информацию. Это может происходят на платформах, таких как Windows 98.

Вызовы должны быть сделаны для обновления, прежде чем пытаться получить атрибут информация, или информация будет устаревшей.

Ключи от MSDN указывают на то, что он принимает информацию о моментальном снимке и атрибутах. будет устаревшим.

Ответ 2

Попробуйте использовать FileInfo и Refresh его метод

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

это должно работать

Ответ 3

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

Это не то, как вы это делаете. File.Create создает запись потока, которая должна быть закрыта, чтобы освободить блокировку без ожидания. Если вы обнаружите, что используете Thread.Sleep, вы часто обнаружите, что что-то не так.