ΠΛΗΡΟΦΟΡΙΕΣ: Εργασία με τη δομή FILETIME

Σύνοψη

Μια φορά το αρχείο αντιπροσωπεύει την συγκεκριμένη ημερομηνία και ώρα κατά την οποία ένα δεδομένο αρχείο δημιουργήθηκε, τελευταία πρόσβαση, ή τελευταία εγγραφή. Μια φορά το αρχείο είναι αποθηκευμένο σε μια δομή FILETIME. Αυτή η δομή χρησιμοποιείται με διάφορες κλήσεις API του Win32.

Περισσότερες πληροφορίες

Η δομή FILETIME αντιπροσωπεύει τον αριθμό των διαστημάτων 100-nanosecond από την 1 Ιανουαρίου 1601. Η δομή που αποτελείται από δύο τιμές 32-bit που συνδυάζονται για να δημιουργήσουν μια μεμονωμένη τιμή 64-bit.
   typedef struct _FILETIME {     DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

Σημειώστε ότι η δομή FILETIME βασίζεται σε διαστήματα των 100 nanosecond. Είναι χρήσιμο για να ορίσετε τα ακόλουθα σύμβολα όταν εργάζεστε με αρχείο φορές. Για παράδειγμα:

   #define _SECOND ((int64) 10000000)   #define _MINUTE (60 * _SECOND)
#define _HOUR (60 * _MINUTE)
#define _DAY (24 * _HOUR)

Εκτέλεση Arithmetics με αρχείο

Συχνά είναι απαραίτητη για την εκτέλεση μιας απλούς αριθμητικούς υπολογισμούς σε αρχείο φορές. Για παράδειγμα, ίσως χρειαστεί να γνωρίζετε πότε ένα αρχείο είναι 30 ημέρες. Για να εκτελέσετε ένα αριθμητικό σε μια ώρα του αρχείου, που χρειάζεστε για να μετατρέψετε το FILETIME σε μια quadword (ένας ακέραιος 64-bit), εκτελέστε τον αριθμητικό και στη συνέχεια να μετατρέψετε το αποτέλεσμα πίσω σε μια FILETIME.


Υποθέτοντας ότι ft είναι μια δομή FILETIME, που περιέχει την ώρα δημιουργίας ενός αρχείου, το ακόλουθο δείγμα κώδικα προσθέτει 30 ημέρες το χρόνο:
   ULONGLONG qwResult;
// Copy the time into a quadword.
qwResult = (((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime;

// Add 30 days.
qwResult += 30 * _DAY;

// Copy the result back into the FILETIME structure.
ft.dwLowDateTime = (DWORD) (qwResult & 0xFFFFFFFF );
ft.dwHighDateTime = (DWORD) (qwResult >> 32 );

Καθορισμός χρόνου αρχείου

Μπορείτε να ορίσετε τις ώρες αρχείου για ένα αρχείο, χρησιμοποιώντας τη συνάρτηση SetFileTime().
   BOOL SetFileTime(     HANDLE hFile,                     // Handle to the file.
CONST FILETIME *lpCreationTime, // Time the file was created.
CONST FILETIME *lpLastAccessTime, // Time the file was last accessed.
CONST FILETIME *lpLastWriteTime // Time the file was last
// written to.
);

Αυτή η λειτουργία σάς επιτρέπει να τροποποιήσετε δημιουργίας, τελευταίας πρόσβασης και τελευταία εγγραφή φορές χωρίς να αλλάξετε το περιεχόμενο του αρχείου. Για να χρησιμοποιήσετε αυτή τη λειτουργία, πρέπει να έχετε ένα δείκτη χειρισμού με το ανοικτό αρχείο. Αυτός ο δείκτης χειρισμού αρχείου μπορεί να ληφθεί από μια κλήση στο η δημιουργία αρχείων() ή OpenFile(). Το αρχείο πρέπει να ανοιχτεί με GENERIC_WRITE πρόσβασης. Αφού ορίσετε τις ώρες αρχείο, θα πρέπει να αφήσετε το δείκτη χειρισμού αρχείων μέσω μιας κλήσης CloseHandle().


Έχει szFilename είναι ένα έγκυρο όνομα αρχείου και ft είναι μια δομή FILETIME, το ακόλουθο δείγμα κώδικα ορίζει την ημερομηνία δημιουργίας του αρχείου έως τη στιγμή που περιέχονται σε πόδια:

   BOOL bResult;   HANDLE hFile = CreateFile( szFilename,
GENERIC_WRITE, // The file must be opened with write access.
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );

if (hFile != INVALID_HANDLE_VALUE) {
bResult = SetFileTime( hFile, &ft, NULL, NULL );
CloseHandle(hFile);
}

Εμφάνιση της ώρας αρχείου

Η ώρα του αρχείου βασίζεται σε Συντονισμένη παγκόσμια ώρα (UTC). Χαλαρά βασίζεται στην ώρα UTC ώρας ορίζεται ως την τρέχουσα ημερομηνία και ώρα της ημέρας στο Greenwich, Αγγλία. Που κατά πάσα πιθανότητα θα θέλετε να εμφανίσετε την ώρα του αρχείου σε σχέση με την τοπική ώρα (δηλαδή, την ημερομηνία και ώρα της ημέρας για τη ζώνη ώρας). Για να γίνει αυτό, μπορείτε να χρησιμοποιήσετε FileTimeToLocalFileTime() ως εξής:

   BOOL FileTimeToLocalFileTime(     CONST FILETIME *lpFileTime,  // Pointer to UTC file time to convert.
LPFILETIME lpLocalFileTime // Pointer to converted file time.
);
Σημειώστε ότι αυτή η λειτουργία χρησιμοποιεί τις τρέχουσες ρυθμίσεις για τη ζώνη ώρας και τη θερινή ώρα. Επομένως, εάν είναι η θερινή ώρα, αυτή η λειτουργία θα λάβει θερινή ώρα υπόψη, ακόμη και αν είναι ο χρόνος που μετατρέπετε με τη χειμερινή ώρα.


Για να εμφανίσετε την ώρα του αρχείου με λογικό τρόπο, θα πρέπει πρώτα να το μετατρέψετε σε μια ώρα του συστήματος χρησιμοποιώντας το FileTimeToSystemTime() ως εξής:

   BOOL FileTimeToSystemTime(     CONST FILETIME *lpFileTime, // Pointer to file time to convert.
LPSYSTEMTIME lpSystemTime // Pointer to structure to receive
); // system time.

Η δομή SYSTEMTIME αντιπροσωπεύει μια ημερομηνία και ώρα χρησιμοποιώντας μεμονωμένα μέλη για το μήνα, ημέρα, έτος, εργάσιμη ημέρα, ώρα, λεπτό, δευτερόλεπτο και χιλιοστό του δευτερολέπτου.


Επίσης, είναι προτιμότερο να εμφανίζουν την ημερομηνία και την ώρα σε μορφή σύμφωνα με τις τρέχουσες τοπικές ρυθμίσεις που επιλέξατε για το σύστημα. Μπορείτε να το κάνετε χρησιμοποιώντας GetDateFormat() και GetTimeFormat() ως εξής:

   int GetDateFormat(     LCID Locale,              // Locale for which date is to be formatted.
DWORD dwFlags, // Flags specifying function options.
CONST SYSTEMTIME *lpDate, // Date to be formatted.
LPCTSTR lpFormat, // Date format string.
LPTSTR lpDateStr, // Buffer for storing formatted string.
int cchDate // Size of buffer.
);

int GetTimeFormat(
LCID Locale, // Locale for which time is to be formatted.
DWORD dwFlags, // Flags specifying function options.
CONST SYSTEMTIME *lpTime, // Time to be formatted.
LPCTSTR lpFormat, // Time format string.
LPTSTR lpTimeStr, // Buffer for storing formatted string.
int cchTime // Size of buffer.
);

Μεταβιβάζοντας LOCALE_USER_DEFAULT ως η πρώτη παράμετρος σε αυτές τις συναρτήσεις, υποδεικνύετε τους για να μορφοποιήσετε το διαβιβάστηκε ημερομηνία/ώρα σύμφωνα με την προεπιλεγμένη μορφή για την τρέχουσα τοπική ρύθμιση. Στην περίπτωση αυτή, μπορείτε να περάσετε NULL για τις παραμέτρους lpFormat.


Υποθέτοντας ότι ft είναι μια δομή FILETIME, που περιέχει μια τιμή ώρας UTC, το ακόλουθο δείγμα κώδικα εκτυπώνει την ημερομηνία αποθηκεύονται σε πόδια:

   SYSTEMTIME st;   char szLocalDate[255], szLocalTime[255];

FileTimeToLocalFileTime( &ft, &ft );
FileTimeToSystemTime( &ft, &st );
GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL,
szLocalDate, 255 );
GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255 );
printf( "%s %s\n", szLocalDate, szLocalTime );

Ιδιότητες

Αναγνωριστικό άρθρου: 188768 - Τελευταία αναθεώρηση: 8 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια