【问题标题】:File creation time in C#C#中的文件创建时间
【发布时间】:2013-08-20 15:54: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);
    }

非常感谢任何帮助。

【问题讨论】:

  • 您是否尝试过使用FileInfo.Refresh
  • 成功了 - 谢谢!

标签: c# .net .net-4.5


【解决方案1】:

你需要使用Refresh:

FileSystemInfo.Refresh 从当前获取文件的快照 文件系统。即使刷新也无法纠正底层文件系统 文件系统返回不正确或过时的信息。这个可以 发生在 Windows 98 等平台上。

在尝试获取属性之前必须调用 Refresh 信息,否则信息将过时。

来自 MSDN 的关键位表明它拍摄快照并且属性信息..将过时

【讨论】:

    【解决方案2】:

    尝试使用FileInfoRefresh的方法吧

    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,你会经常发现自己做错了什么。

      【讨论】:

        【解决方案4】:

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

        https://docs.microsoft.com/en-us/dotnet/api/system.io.file.getcreationtime?view=netframework-4.8

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-24
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          相关资源
          最近更新 更多