Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какие есть еще функции типа FileAge? а то эта deprecated 
V
    Опции темы
Etar
Дата 16.7.2009, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 21.2.2008

Репутация: нет
Всего: 1



Нужно получить время изменения файла по его имени в формате FileDate, но функция FileAge оказывается уже устарела в D2009. Есть еще FileGetDate, но там нужно сперва файл открывать или создавать.
Есть какие-нибудь функции, которые на лету выхватывают из файла дату? (или в них тоже сперва открытие файла происходит?)
PM MAIL   Вверх
CodeMonkey
Дата 16.7.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Вообще-то, FileAge устарела ещё в Delphi 2.

Из JCL (как видим: ничего сложного):

Код
interface

...

function GetFileInformation(const FileName: string; out FileInfo: TSearchRec): Boolean; overload;
function GetFileInformation(const FileName: string): TSearchRec; overload;

function GetFileCreation(const FileName: string): TFileTime; overload;
function GetFileCreation(const FileName: string; out LocalTime: TDateTime): Boolean; overload;
function GetFileLastWrite(const FileName: string): TFileTime; overload;
function GetFileLastWrite(const FileName: string; out LocalTime: TDateTime): Boolean; overload;
function GetFileLastAccess(const FileName: string): TFileTime; overload;
function GetFileLastAccess(const FileName: string; out LocalTime: TDateTime): Boolean; overload;

implementation

...

function FileTimeToLocalDateTime(const FileTime: TFileTime): TDateTime;
begin
  // самостоятельно ;)
end;

...

function GetFileInformation(const FileName: string; out FileInfo: TSearchRec): Boolean; 
begin
  Result := FindFirst(FileName, faAnyFile, FileInfo) = 0;
  if Result then
    SysUtils.FindClose(FileInfo);
end;

function GetFileInformation(const FileName: string): TSearchRec;
begin
  if not GetFileInformation(FileName, Result) then
    RaiseLastOSError;
end;

function GetFileCreation(const FileName: string): TFileTime;
begin
  Result := GetFileInformation(FileName).FindData.ftCreationTime;
end;

function GetFileCreation(const FileName: string; out LocalTime: TDateTime): Boolean;
var
  FileInfo: TSearchRec;
begin
  Result := GetFileInformation(FileName, FileInfo);
  if Result then
    LocalTime := FileTimeToLocalDateTime(GetFileInformation(FileName).FindData.ftCreationTime);
end;

function GetFileLastWrite(const FileName: string): TFileTime;
begin
  Result := GetFileInformation(FileName).FindData.ftLastWriteTime;
end;

function GetFileLastWrite(const FileName: string; out LocalTime: TDateTime): Boolean;
var
  FileInfo: TSearchRec;
begin
  Result := GetFileInformation(FileName, FileInfo);
  if Result then
    LocalTime := FileTimeToLocalDateTime(GetFileInformation(FileName).FindData.ftLastWriteTime);
end;

function GetFileLastAccess(const FileName: string): TFileTime;
begin
  Result := GetFileInformation(FileName).FindData.ftLastAccessTime;
end;

function GetFileLastAccess(const FileName: string; out LocalTime: TDateTime): Boolean;
var
  FileInfo: TSearchRec;
begin
  Result := GetFileInformation(FileName, FileInfo);
  if Result then
    LocalTime := FileTimeToLocalDateTime(GetFileInformation(FileName).FindData.ftLastAccessTime);
end;



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Romikgy
Дата 22.7.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(CodeMonkey @  16.7.2009,  08:39 Найти цитируемый пост)
function FileTimeToLocalDateTime(const FileTime: TFileTime): TDateTime;
begin
  // самостоятельно ;)
end;

TimeStampToDateTime ...

Код

function FileAge(const FileName: string): Integer;
{$IFDEF MSWINDOWS}
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result := -1;
end;
{$ENDIF}


Это сообщение отредактировал(а) Romikgy - 22.7.2009, 13:16


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Riply
Дата 22.7.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(CodeMonkey @  16.7.2009,  09:39 Найти цитируемый пост)
Из JCL (как видим: ничего сложного):


Сдается мне, что в FindFirstFileExW все же идет открытие файла через NtOpenFile в user mode.

Я бы попробовала через NtQueryAttributesFile.
Объект она скорее всего открывает уже в kernel mode и через ObOpenObjectByName.

Все это нуждается в проверке.
Т.к. автор хотел
Цитата(Etar @  16.7.2009,  07:44 Найти цитируемый пост)
Есть какие-нибудь функции, которые на лету выхватывают из файла дату? (или в них тоже сперва открытие файла происходит?) 

то ему с этой проверкой и карты в руки smile

Если лень лезть во внутренности, то можно просто в цикле повызывать данные ф-ии и сравнить время.
Не исключен вариант, что NtQueryAttributesFile хорошо обставит FindFirst smile 

P.S.
 Мне тож интересно кто быстрее smile
PM MAIL   Вверх
mrbrooks
Дата 22.7.2009, 16:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Можно и так. Код из Билдера, но суть одна. 
Код

WIN32_FILE_ATTRIBUTE_DATA fad;
if (GetFileAttributesEx("c:\\file.txt", GetFileExInfoStandard,&fad))
{
 SYSTEMTIME st;
 FILETIME ft;
 FileTimeToLocalFileTime(&fad.ftLastWriteTime, &ft);
 FileTimeToSystemTime(&ft, &st);
 TDateTime dt = SystemTimeToDateTime(st);
 ShowMessage(dt.DateTimeString());
}



Etar, WIN32_FILE_ATTRIBUTE_DATA структура интересная. Рекомендую ее посмотреть в MSDN.
PM MAIL   Вверх
Quartz
Дата 6.8.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 28.6.2008

Репутация: 3
Всего: 4



Цитата(CodeMonkey @  16.7.2009,  09:39 Найти цитируемый пост)
Вообще-то, FileAge устарела ещё в Delphi 2.

Код

function FileAge(const FileName: string): Integer; overload; deprecated;
function FileAge(const FileName: string; out FileDateTime: TDateTime): Boolean; overload; // <=== OK

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1042 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.