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

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

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);
    }

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

3 ответов


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

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

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

ключевые биты из MSDN указывают, что это делает снимок и атрибуты..будет устаревшим.


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

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

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


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

это не так, как вы делаете это. Файл.Create создает Stream writer, который должен быть закрыт, чтобы освободить блокировку без ожидания. Если вы обнаружите, что используете Thread.Засыпая, вы часто обнаруживаете, что делаете что-то не так.