Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2010, 16:06   #1
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию Дата и время изменения файла

Как получить дату и время изменения файла? С датой у меня все в порядке, а вот время разное. В свойствах файла у меня, к примеру, "20 мая 2008 года 15:30:50", а у меня выводится либо "12:30:50" или "16:30:50".
Код:
int GetLastWriteDateAndTime(LPCSTR fullPathToFile, LPSTR dateTimeStr)
{
	HANDLE hFile;
	FILETIME ftCreate, ftAccess, ftWrite;
	SYSTEMTIME stUTC, stLocal;
	char sDateAndTime[MAX_PATH];

	hFile = CreateFile(fullPathToFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if(hFile == INVALID_HANDLE_VALUE)
		return 1;
	
	// получаем файловую дату и время
	if(!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
		return 2;
	
	// преобразовываем время модификации в локальное время
	FileTimeToSystemTime(&ftWrite, &stUTC);
	//SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal); // +3/+4 часа
	
	sprintf(sDateAndTime, "%d-%02d-%02d  %02d:%02d:%02d", stUTC.wYear, stUTC.wMonth, stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);
	strncpy(dateTimeStr, sDateAndTime, MAX);
	CloseHandle(hFile);

	return 0;
}
Qwe1 вне форума Ответить с цитированием
Старый 20.12.2010, 23:12   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Попробуйте вот этой функой перед вызовом FileTimeToSystemTime файловое время из системного в локальное конвертнуть:

Цитата:
The FileTimeToLocalFileTime function converts a file time based on the Coordinated Universal Time (UTC) to a local file time.

BOOL FileTimeToLocalFileTime(

CONST FILETIME *lpFileTime, // pointer to UTC file time to convert
LPFILETIME lpLocalFileTime // pointer to converted file time
);


Parameters

lpFileTime

Points to a FILETIME structure containing the UTC-based file time to be converted into a local file time.

lpLocalFileTime

Points to a FILETIME structure to receive the converted local file time. This parameter cannot be the same as the lpFileTime parameter.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 21.12.2010, 02:20   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Забыли про часовой пояс и летнее время.

GetFileTime возвращает время в UTC, что есть 12:30:50. Вам, видимо, нужно местное - что есть +3 часа (15:30:50).

Пример из MSDN.

Ну и летнее время ещё учесть.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 21.12.2010, 13:51   #4
Exception
Пользователь
 
Регистрация: 31.12.2007
Сообщений: 37
По умолчанию

Блин а я так делал...

Код:
function GetCreationTimeFateFileW(pszText: WideString): WideString;
var
  hf      : HFILE;
  bRet    : BOOL;
  ftCreate: TFileTime;
  ftAccess: TFileTime;
  ftWrite : TFileTime;
  stUTC   : TSystemTime;
  stLocal : TSystemTime;
  tzi     : TTimeZoneInformation;
  dwRet   : DWORD;
begin

  Result := '';

  hf := CreateFileW(LPWSTR(pszText), GENERIC_READ, FILE_SHARE_READ, nil,
    OPEN_EXISTING, 0, 0);
  if (hf <> INVALID_HANDLE_VALUE) then
  try

    bRet := GetFileTime(hf, @ftCreate, @ftAccess, @ftWrite);
    if bRet then
    try

      bRet := FileTimeToSystemTime(ftWrite, stUTC);
      if bRet then
      try

        dwRet := GetTimeZoneInformation(tzi);
        case dwRet of
          TIME_ZONE_ID_DAYLIGHT: tzi.DaylightBias := 0;
          TIME_ZONE_ID_STANDARD: tzi.StandardBias := 0;
          TIME_ZONE_ID_UNKNOWN : tzi.DaylightBias := 0;
        end;
        bRet := SystemTimeToTzSpecificLocalTime(@tzi, stUTC, stLocal);
        if bRet then
        try

          Result := FormatW(
            LoadStrInstW(hLangFile, IDS_INFO_FILETIME),
            [stLocal.wHour, stLocal.wMinute, stLocal.wSecond, stLocal.wDay,
            stLocal.wMonth, stLocal.wYear]
          );

        finally
        end;

      finally
      end;

    finally
    end;

  finally
    CloseHandle(hf);
  end;

end;
Exception вне форума Ответить с цитированием
Старый 22.12.2010, 10:19   #5
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

Попробовал по совету Ulex воспользоваться функцией FileTimeToLocalFileTime, получилось, спасибо.

Код:
int main(void)
{
	HANDLE hFile;
	FILETIME ftCreate, ftAccess, ftWrite, lpLocalFileTime;
	SYSTEMTIME stUTC, stLocal;

	char fullPathToFile[] = "C:\\mytestfile.txt";
	char lpszString[MAX_PATH];

	hFile = CreateFile(fullPathToFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if(hFile != INVALID_HANDLE_VALUE)
	{
		 // получить файловую дату и время
		if(!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
		{
			cout << "Error!" << endl;
			return 1;
		}

		 // преобразовать время модификации в локальное время
		FileTimeToLocalFileTime(&ftWrite, &lpLocalFileTime);
		FileTimeToSystemTime(&lpLocalFileTime, &stUTC);
		
		sprintf(lpszString, "%d-%02d-%02d  %02d:%02d:%02d", stUTC.wYear, stUTC.wMonth, stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);
		cout << lpszString << endl;
	}
	else
		cout << "Error open file!" << endl;
	CloseHandle(hFile);

	return 0;
}
Qwe1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Время изменения файла Fok Общие вопросы Delphi 4 04.10.2010 16:13
Атрибуты файла - дата последнего изменения iskurt Общие вопросы C/C++ 1 19.06.2010 13:21
Дата и время изменения файла Demien Общие вопросы Delphi 5 24.11.2009 12:36
Дата последнего изменения файла GrindeX Паскаль, Turbo Pascal, PascalABC.NET 2 26.05.2009 17:22
время и дата изменения файла dimonbest Общие вопросы Delphi 3 12.03.2008 06:51