Поделиться через


DateTimeOffset.FromFileTime(Int64) Метод

Определение

Преобразует указанное время файла Windows в эквивалентное локальное время.

public:
 static DateTimeOffset FromFileTime(long fileTime);
public static DateTimeOffset FromFileTime (long fileTime);
static member FromFileTime : int64 -> DateTimeOffset
Public Shared Function FromFileTime (fileTime As Long) As DateTimeOffset

Параметры

fileTime
Int64

Время файла Windows, выраженное в галках.

Возвращаемое значение

Объект, представляющий дату и время fileTime со смещением, заданным для смещения локального времени.

Исключения

fileTime меньше нуля.

-или-

fileTime больше DateTimeOffset.MaxValue.Ticks.

Примеры

В следующем примере API Windows используется для получения времени файла Windows для исполняемого файла WordPad.

using System;
using System.IO;
using System.Runtime.InteropServices;

public struct FileTime
{
   public uint dwLowDateTime;
   public uint dwHighDateTime;

   public static implicit operator long(FileTime fileTime)
   {
      long returnedLong;
      // Convert 4 high-order bytes to a byte array
      byte[] highBytes = BitConverter.GetBytes(fileTime.dwHighDateTime);
      // Resize the array to 8 bytes (for a Long)
      Array.Resize(ref highBytes, 8);

      // Assign high-order bytes to first 4 bytes of Long
      returnedLong = BitConverter.ToInt64(highBytes, 0);
      // Shift high-order bytes into position
      returnedLong = returnedLong << 32;
      // Or with low-order bytes
      returnedLong = returnedLong | fileTime.dwLowDateTime;
      // Return long
      return returnedLong;
   }
}

public class FileTimes
{
   private const int OPEN_EXISTING = 3;
   private const int INVALID_HANDLE_VALUE = -1;

   [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
   private static extern int CreateFile(string lpFileName,
                                       int dwDesiredAccess,
                                       int dwShareMode,
                                       int lpSecurityAttributes,
                                       int dwCreationDisposition,
                                       int dwFlagsAndAttributes,
                                       int hTemplateFile);

   [DllImport("Kernel32.dll")]
   private static extern bool GetFileTime(int hFile,
                                          out FileTime lpCreationTime,
                                          out FileTime lpLastAccessTime,
                                          out FileTime lpLastWriteTime);

   [DllImport("Kernel32.dll")]
   private static extern bool CloseHandle(int hFile);

   public static void Main()
   {
      // Open file %windir%\write.exe
      string winDir = Environment.SystemDirectory;
      if (!(winDir.EndsWith(Path.DirectorySeparatorChar.ToString())))
         winDir += Path.DirectorySeparatorChar;
      winDir += "write.exe";

      // Get file time using Windows API
      //
      // Open file
      int hFile = CreateFile(winDir, 0, 0, 0, OPEN_EXISTING, 0, 0);
      if (hFile == INVALID_HANDLE_VALUE)
      {
         Console.WriteLine("Unable to access {0}.", winDir);
      }
      else
      {
         FileTime creationTime, accessTime, writeTime;
         if (GetFileTime(hFile, out creationTime, out accessTime, out writeTime))
         {
            CloseHandle(hFile);
            long fileCreationTime = (long) creationTime;
            long fileAccessTime = accessTime;
            long fileWriteTime = (long) writeTime;

            Console.WriteLine("File {0} Retrieved Using the Windows API:", winDir);
            Console.WriteLine("   Created:     {0:d}", DateTimeOffset.FromFileTime(fileCreationTime).ToString());
            Console.WriteLine("   Last Access: {0:d}", DateTimeOffset.FromFileTime(fileAccessTime).ToString());
            Console.WriteLine("   Last Write:  {0:d}", DateTimeOffset.FromFileTime(fileWriteTime).ToString());
            Console.WriteLine();
         }
      }

      // Get date and time, convert to file time, then convert back
      FileInfo fileInfo = new FileInfo(winDir);
      DateTimeOffset infoCreationTime, infoAccessTime, infoWriteTime;
      long ftCreationTime, ftAccessTime, ftWriteTime;

      // Get dates and times of file creation, last access, and last write
      infoCreationTime = fileInfo.CreationTime;
      infoAccessTime = fileInfo.LastAccessTime;
      infoWriteTime = fileInfo.LastWriteTime;
      // Convert values to file times
      ftCreationTime = infoCreationTime.ToFileTime();
      ftAccessTime = infoAccessTime.ToFileTime();
      ftWriteTime = infoWriteTime.ToFileTime();

      // Convert file times back to DateTimeOffset values
      Console.WriteLine("File {0} Retrieved Using a FileInfo Object:", winDir);
      Console.WriteLine("   Created:     {0:d}", DateTimeOffset.FromFileTime(ftCreationTime).ToString());
      Console.WriteLine("   Last Access: {0:d}", DateTimeOffset.FromFileTime(ftAccessTime).ToString());
      Console.WriteLine("   Last Write:  {0:d}", DateTimeOffset.FromFileTime(ftWriteTime).ToString());
   }
}
// The example produces the following output:
//    File C:\WINDOWS\system32\write.exe Retrieved Using the Windows API:
//       Created:     10/13/2005 5:26:59 PM -07:00
//       Last Access: 3/20/2007 2:07:00 AM -07:00
//       Last Write:  8/4/2004 5:00:00 AM -07:00
//
//    File C:\WINDOWS\system32\write.exe Retrieved Using a FileInfo Object:
//       Created:     10/13/2005 5:26:59 PM -07:00
//       Last Access: 3/20/2007 2:07:00 AM -07:00
//       Last Write:  8/4/2004 5:00:00 AM -07:00
open System
open System.IO
open System.Runtime.InteropServices
open FSharp.NativeInterop

[<Struct>]
type FileTime =
    val dwLowDateTime: uint
    val dwHighDateTime: uint

    static member ToLong(fileTime: FileTime) =
        // Convert 4 high-order bytes to a byte array
        let mutable highBytes = BitConverter.GetBytes fileTime.dwHighDateTime
        
        // Resize the array to 8 bytes (for a Long)
        Array.Resize(&highBytes, 8)

        // Assign high-order bytes to first 4 bytes of Long
        let returnedLong = BitConverter.ToInt64(highBytes, 0)
        
        // Shift high-order bytes into position
        let returnedLong = returnedLong <<< 32
        
        // Or with low-order bytes
        returnedLong ||| int64 fileTime.dwLowDateTime

let [<Literal>] OPEN_EXISTING = 3
let [<Literal>] INVALID_HANDLE_VALUE = -1

[<DllImport("Kernel32.dll", CharSet = CharSet.Unicode)>]
extern int CreateFile(string lpFileName,
                      int dwDesiredAccess,
                      int dwShareMode,
                      int lpSecurityAttributes,
                      int dwCreationDisposition,
                      int dwFlagsAndAttributes,
                      int hTemplateFile)

[<DllImport "Kernel32.dll">]
extern bool GetFileTime(int hFile,
                        nativeint lpCreationTime,
                        nativeint lpLastAccessTime,
                        nativeint lpLastWriteTime)

[<DllImport "Kernel32.dll">]
extern bool CloseHandle(int hFile)


// Open file %windir%\write.exe
let winDir = 
    let winDir = Environment.SystemDirectory
    let winDir =
        if winDir.EndsWith(string Path.DirectorySeparatorChar) then
            winDir
        else
            winDir + string Path.DirectorySeparatorChar
    winDir + "write.exe"

// Get file time using Windows API
// Open file
let hFile = CreateFile(winDir, 0, 0, 0, OPEN_EXISTING, 0, 0)

if hFile = INVALID_HANDLE_VALUE then
    printfn $"Unable to access {winDir}."
else
    let mutable creationTime = Unchecked.defaultof<FileTime>
    let mutable accessTime = Unchecked.defaultof<FileTime>
    let mutable writeTime = Unchecked.defaultof<FileTime>

    if GetFileTime(hFile, NativePtr.toNativeInt &&creationTime, NativePtr.toNativeInt &&accessTime, NativePtr.toNativeInt &&writeTime) then
        let fileCreationTime = FileTime.ToLong creationTime
        let fileAccessTime = FileTime.ToLong accessTime
        let fileWriteTime = FileTime.ToLong writeTime

        printfn $"File {winDir} Retrieved Using the Windows API:"
        printfn $"   Created:     {DateTimeOffset.FromFileTime fileCreationTime |> string:d}"
        printfn $"   Last Access: {DateTimeOffset.FromFileTime fileAccessTime |> string:d}"
        printfn $"   Last Write:  {DateTimeOffset.FromFileTime fileWriteTime |> string:d}\n"

// Get date and time, convert to file time, then convert back
let fileInfo = FileInfo winDir

// Get dates and times of file creation, last access, and last write
let infoCreationTime = fileInfo.CreationTime
let infoAccessTime = fileInfo.LastAccessTime
let infoWriteTime = fileInfo.LastWriteTime

// Convert values to file times
let ftCreationTime = infoCreationTime.ToFileTime()
let ftAccessTime = infoAccessTime.ToFileTime()
let ftWriteTime = infoWriteTime.ToFileTime()

// Convert file times back to DateTimeOffset values
printfn $"File {winDir} Retrieved Using a FileInfo Object:"
printfn $"   Created:     {DateTimeOffset.FromFileTime ftCreationTime |> string:d}"
printfn $"   Last Access: {DateTimeOffset.FromFileTime ftAccessTime |> string:d}"
printfn $"   Last Write:  {DateTimeOffset.FromFileTime ftWriteTime |> string:d}"


// The example produces the following output:
//    File C:\WINDOWS\system32\write.exe Retrieved Using the Windows API:
//       Created:     10/13/2005 5:26:59 PM -07:00
//       Last Access: 3/20/2007 2:07:00 AM -07:00
//       Last Write:  8/4/2004 5:00:00 AM -07:00
//
//    File C:\WINDOWS\system32\write.exe Retrieved Using a FileInfo Object:
//       Created:     10/13/2005 5:26:59 PM -07:00
//       Last Access: 3/20/2007 2:07:00 AM -07:00
//       Last Write:  8/4/2004 5:00:00 AM -07:00
Imports System.IO

Public Structure FileTime
   Public dwLowDateTime As UInteger
   Public dwHighDateTime As UInteger

   Public Shared Widening Operator CType(fileTime As FileTime) As Long
      Dim returnedLong As Long
      ' Convert 4 high-order bytes to a byte array
      Dim highBytes() As Byte = BitConverter.GetBytes(fileTime.dwHighDateTime)
      ' Resize the array to 8 bytes (for a Long)
      ReDim Preserve highBytes(7)

      ' Assign high-order bytes to first 4 bytes of Long
      returnedLong = BitConverter.ToInt64(highBytes, 0) 
      ' Shift high-order bytes into position
      returnedLong = returnedLong << 32
      ' Or with low-order bytes
      returnedLong = returnedLong Or fileTime.dwLowDateTime
      ' Return Long 
      return returnedLong
   End Operator
End Structure

Module modMain
   Private Const OPEN_EXISTING As Integer = 3
   
   Private Const INVALID_HANDLE_VALUE As Integer = -1
      
   Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
                            ByVal lpFileName As String, _
                            ByVal dwDesiredAccess As Integer, _
                            ByVal dwShareMode As Integer, _
                            ByVal lpSecurityAttributes As Integer, _
                            ByVal dwCreationDisposition As Integer, _
                            ByVal dwFlagsAndAttributes As Integer, _
                            ByVal hTemplateFile As Integer) _
           As Integer

   Private Declare Function GetFileTime Lib "Kernel32"( _
                            hFile As Integer, _
                            ByRef lpCreationTime As FileTime, _
                            ByRef lpLastAccessTime As FileTime, _
                            ByRef lpLastWriteTime As FileTime) _
            As Boolean 

   Private Declare Function CloseHandle Lib "Kernel32" ( _
                            hFile As Integer) _
           As Boolean
                        
   Public Sub Main()
      ' Open file %windir%\write.exe
      Dim winDir As String = Environment.SystemDirectory 
      If Not winDir.EndsWith(Path.DirectorySeparatorChar) Then _
         winDir += Path.DirectorySeparatorChar 
      windir += "write.exe"

      ' Get file time using Windows API
      '
      ' Open file
      Dim hFile As Integer = CreateFile(winDir, 0, 0, 0, _
                                       OPEN_EXISTING, 0, 0)
      If hFile = INVALID_HANDLE_VALUE Then
         Console.WriteLine("Unable to access {0}.", winDir)
      Else
         Dim creationTime, accessTime, writeTime As FileTime
         If GetFileTime(hFile, creationTime, accessTime, writeTime) Then
            CloseHandle(hFile)
            Dim fileCreationTime As Long = CType(creationTime, Long)
            Dim fileAccessTime As Long = CType(accessTime, Long)
            Dim fileWriteTime As Long = CType(writeTime, Long)

            Console.WriteLine("File {0} Retrieved Using the Windows API:", winDir)
            Console.WriteLine("   Created:     {0:d}", DateTimeOffset.FromFileTime(fileCreationTime).ToString())
            Console.WriteLine("   Last Access: {0:d}", DateTimeOffset.FromFileTime(fileAccessTime).ToString())
            Console.WriteLine("   Last Write:  {0:d}", DateTimeOffset.FromFileTime(fileWriteTime).ToString())
            Console.WriteLine() 
         End If   
      End If
      
      ' Get date and time, convert to file time, then convert back
      Dim fileInfo As New FileInfo(winDir)
      Dim infoCreationTime, infoAccessTime, infoWriteTime As DateTimeOffset
      Dim ftCreationTime, ftAccessTime, ftWriteTime As Long
      
      ' Get dates and times of file creation, last access, and last write
      infoCreationTime = fileInfo.CreationTime
      infoAccessTime = fileInfo.LastAccessTime
      infoWriteTime = fileInfo.LastWriteTime
      ' Convert values to file times
      ftCreationTime = infoCreationTime.ToFileTime()
      ftAccessTime = infoAccessTime.ToFileTime()
      ftWriteTime = infoWriteTime.ToFileTime()
      
      ' Convert file times back to DateTimeOffset values
      Console.WriteLine("File {0} Retrieved Using a FileInfo Object:", winDir)
      Console.WriteLine("   Created:     {0:d}", DateTimeOffset.FromFileTime(ftCreationTime).ToString())
      Console.WriteLine("   Last Access: {0:d}", DateTimeOffset.FromFileTime(ftAccessTime).ToString())
      Console.WriteLine("   Last Write:  {0:d}", DateTimeOffset.FromFileTime(ftWriteTime).ToString()) 
   End Sub
End Module
' The example produces the following output:
'    File C:\WINDOWS\system32\write.exe Retrieved Using the Windows API:
'       Created:     10/13/2005 5:26:59 PM -07:00
'       Last Access: 3/20/2007 2:07:00 AM -07:00
'       Last Write:  8/4/2004 5:00:00 AM -07:00
'    
'    File C:\WINDOWS\system32\write.exe Retrieved Using a FileInfo Object:
'       Created:     10/13/2005 5:26:59 PM -07:00
'       Last Access: 3/20/2007 2:07:00 AM -07:00
'       Last Write:  8/4/2004 5:00:00 AM -07:00

Комментарии

Время файла Windows — это 64-разрядное значение, представляющее количество интервалов 100-nanosecond, прошедших с 12:00 полуночи, 1 января 1601 года A.D. (C.E.) Координированное универсальное время (UTC). Windows использует время записи файла при создании, доступе к приложению или записи в файл.

Время файла Windows доступно напрямую через API Windows, вызвав функцию GetFileTime, которая возвращает структуру FILETIME. Параметр одной функции — это дескриптор файла, сведения о времени которого необходимо получить. Дескриптор файла извлекается путем вызова функции CreateFile. Элемент dwHighDateTime структуры FILETIME содержит четыре байта времени с высоким порядком, а его элемент dwLowDateTime содержит четыре байта с низким порядком. В следующем примере показано, как получить значения времени файла Windows и преобразовать их в DateTimeOffset значения.

Значения времени файла Windows также можно создавать из значений DateTime путем вызова методов DateTime.ToFileTime и DateTime.ToFileTimeUtc, а также из DateTimeOffset значений путем вызова метода DateTimeOffset.ToFileTime.

Применяется к