Sdílet prostřednictvím


DateTimeOffset.FromFileTime(Int64) Metoda

Definice

Převede zadaný čas souboru Systému Windows na ekvivalentní místní čas.

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

Parametry

fileTime
Int64

Čas souboru Systému Windows vyjádřený v ticks.

Návraty

Objekt, který představuje datum a čas fileTime s posunem nastaveným na místní časový posun.

Výjimky

fileTime je menší než nula.

-nebo-

fileTime je větší než DateTimeOffset.MaxValue.Ticks.

Příklady

Následující příklad používá rozhraní API systému Windows k načtení časů souborů systému Windows pro spustitelný soubor 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

Poznámky

Čas souboru Systému Windows je 64bitová hodnota, která představuje počet intervalů 100 nanosekund, které uplynuly od 12:00 půlnoci, 1. ledna 1601 A.D. (C.E.) Koordinovaný univerzální čas (UTC). Systém Windows používá k zaznamenávání času při vytváření, přístupu nebo zápisu aplikace do souboru.

Čas souboru systému Windows je přímo přístupný prostřednictvím rozhraní API systému Windows voláním funkce GetFileTime, která vrací FILETIME strukturu. Jedním parametrem funkce je popisovač souboru, jehož informace o čase souboru se mají načíst. Popisovač souboru se načte voláním funkce CreateFile. Člen struktury FILETIMEdwHighDateTime obsahuje čtyři bajty s vysokým pořadím času souboru a jeho dwLowDateTime člen obsahuje čtyři bajty s nízkým pořadím. Následující příklad ukazuje, jak načíst hodnoty času souboru systému Windows a převést je na DateTimeOffset hodnoty.

Hodnoty času souboru systému Windows lze vytvořit také z DateTime hodnot voláním metod DateTime.ToFileTime a DateTime.ToFileTimeUtc a z DateTimeOffset hodnot voláním metody DateTimeOffset.ToFileTime.

Platí pro