DateTimeOffset.FromFileTime(Int64) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Convierte la hora del archivo de Windows especificada en una hora local equivalente.
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
Parámetros
- fileTime
- Int64
Un tiempo de archivo de Windows, expresado en tics.
Devoluciones
Objeto que representa la fecha y hora de fileTime
con el desplazamiento establecido en el desplazamiento de hora local.
Excepciones
fileTime
es menor que cero.
-o-
fileTime
es mayor que DateTimeOffset.MaxValue.Ticks
.
Ejemplos
En el ejemplo siguiente se usa la API de Windows para recuperar los tiempos de archivo de Windows para el ejecutable de 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
Comentarios
Un tiempo de archivo de Windows es un valor de 64 bits que representa el número de intervalos de 100 nanosegundos transcurridos desde la medianoche del 12:00, 1 de enero de 1601 A.D. (C.E.) Hora universal coordinada (UTC). Windows usa un tiempo de archivo para registrar cuando una aplicación crea, accede o escribe en un archivo.
Se puede acceder directamente a un tiempo de archivo de Windows a través de la API de Windows mediante una llamada a la función GetFileTime
, que devuelve una estructura de FILETIME
. El parámetro de función única es el identificador del archivo cuya información de tiempo de archivo se va a recuperar. El identificador de archivo se recupera llamando a la función CreateFile
. El miembro dwHighDateTime
de la estructura FILETIME
contiene los cuatro bytes de orden superior del tiempo de archivo y su miembro dwLowDateTime
contiene los cuatro bytes de orden bajo. En el ejemplo siguiente se muestra cómo recuperar valores de hora de archivo de Windows y convertirlos en valores de DateTimeOffset.
Los valores de tiempo de archivo de Windows también se pueden crear a partir de valores de DateTime llamando a los métodos DateTime.ToFileTime y DateTime.ToFileTimeUtc, y desde valores de DateTimeOffset llamando al método DateTimeOffset.ToFileTime.