معلومات إضافية: العمل مع بنية FILETIME

ملخص

وقت ملف يمثل تاريخ محدد والوقت الذي ملف محدد تم إنشاؤها، الوصول إلى آخر، أو كتابة الأخير. يتم تخزين وقت ملف في بنية FILETIME. يتم استخدام هذه البنية باستخدام استدعاءات Win32 API المختلفة.

مزيد من المعلومات

يمثل بنية FILETIME عدد الزمنية 100-nanosecond منذ 1 كانون الثاني/يناير 1601. تتكون البنية القيمتين 32 بت التي تجتمع لتشكل قيمة 64-بت واحدة.
   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)

تنفيذ مترادفين بأوقات الملف

من الضروري غالباً لتنفيذ بعض العمليات الرياضية بسيطة على أوقات الملف. على سبيل المثال، قد تحتاج إلى معرفة حالة ملف 30 يوما. لتنفيذ حسابي على وقت ملف، تحتاج لتحويل في FILETIME إلى quadword (64 بت)، إجراء الحسابات، وقم بتحويل الناتج إلى 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.
);

تمكنك هذه الدالة إنشاء تعديل وآخر الوصول إلى آخر كتابة مرات دون تغيير محتوى الملف. لاستخدام هذه الوظيفة، يجب عليك مقبض لفتح الملف. يمكن الحصول على مؤشر الملف هذا من استدعاء createfile () أو openfile (). يجب فتح الملف مع وصول GENERIC_WRITE. بعد تعيين أوقات الملف، يجب تحرير مؤشر الملف من خلال استدعاء CloseHandle().


بافتراض سزفيلينامي اسم ملف صالح وقدم بنية 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 تعتمد معرفاً بالتاريخ الحالي والوقت من اليوم في جرينتش بإنجلترا. ستحتاج غالباً إلى عرض وقت الملف فيما يتعلق بالتوقيت المحلي (أي، التاريخ والوقت من اليوم للمنطقة الزمنية الخاصة بك). للقيام بذلك، يمكنك استخدام 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 للمعلمات لبفورمات.


فرض 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 - آخر مراجعة: 08‏/01‏/2017 - المراجعة: 1

تعليقات