C# C语言中的文件创建时间#

C# C语言中的文件创建时间#,c#,.net,.net-4.5,C#,.net,.net 4.5,我需要在创建文件时获取-我已尝试使用: FileInfo fi = new FileInfo(FilePath); var creationTime = fi.CreationTimeUtc; 及 这两种方法通常都返回错误的创建时间-我猜它被缓存在某个地方 该文件被删除并以相同的名称重新创建,我需要知道何时/是否已重新创建(通过检查创建日期/时间是否已更改)-我计划通过查看文件创建时间已更改来执行此操作,但我发现这不准确 我正在处理Win7,如果我选中文件资源管理器,它会正确显示新文件的创建时

我需要在创建文件时获取-我已尝试使用:

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

这两种方法通常都返回错误的创建时间-我猜它被缓存在某个地方

该文件被删除并以相同的名称重新创建,我需要知道何时/是否已重新创建(通过检查创建日期/时间是否已更改)-我计划通过查看文件创建时间已更改来执行此操作,但我发现这不准确

我正在处理Win7,如果我选中文件资源管理器,它会正确显示新文件的创建时间

我也尝试过使用FileSystemWatcher,但它并不完全适用于我的用例。例如,如果我的程序没有运行,则FileSystemWatcher没有运行,因此当我的程序再次启动时,我不知道文件是否已被删除并重新创建

我看过MSDN,上面写着:

此方法可能返回不准确的值,因为它使用的本机函数的值可能不会被操作系统持续更新

但我也尝试过使用他们的替代建议,在创建新文件后设置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);
    }

非常感谢您的帮助。

尝试使用
FileInfo
及其方法

fileInfo.Refresh();
var created = fileInfo.CreationTime;
这应该有效

您需要使用:

Refresh从当前数据库获取文件的快照 文件系统。刷新无法更正基础文件系统,即使 文件系统返回不正确或过时的信息。这个可以 在Windows 98等平台上发生

在尝试获取属性之前,必须进行刷新调用 信息,否则信息将过时

MSDN中的关键位表示它获取快照,属性信息将过时

你不是这样做的。Create创建流编写器,应该关闭流编写器以释放锁,而无需等待。如果你发现自己在使用Thread.Sleep,你会经常发现自己做错了什么

如果path参数中描述的文件不存在,则此方法返回1601年1月1日午夜12:00(C.E.)协调世界时(UTC),调整为本地时间


您是否尝试过使用
FileInfo.Refresh
?成功了-谢谢!
fileInfo.Refresh();
var created = fileInfo.CreationTime;
 File.Create(fullFilePathUri.LocalPath);
 Thread.Sleep(1000); // give the file creation a chance to release any lock