Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дата последнего изменения файла

2.0K
18 июля 2007 года
nevile
138 / / 05.01.2007
Добрый день, всем.

Проблема заключается в том что надо определить дату последнего изменения файла.

Нашел следующий код:

Код:
function GetFileDate(FileName: string): string;

var
  FHandle: Integer;

begin
  FHandle := FileOpen(FileName, 0);
  try
    Result := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));
  finally
    FileClose(FHandle);
  end;
end;


но в строчке:

 
Код:
Result := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));


он выдает ошибку.
Если убрать FileDateToDateTime то он работает но выводит как можно понять не правильную дату.

Кто-нибудь сталкивался с подобным?
497
18 июля 2007 года
IL84
267 / / 24.04.2003
Какую ошибку выдает?
2.0K
19 июля 2007 года
nevile
138 / / 05.01.2007
Вот такая.
16K
20 июля 2007 года
OlbanyRok
75 / / 14.07.2007
А чего, AsiignFile не работает?
2.0K
20 июля 2007 года
nevile
138 / / 05.01.2007
OlbanyRok предложи свой вариант. я что то не совсем тебя понял
2.0K
23 июля 2007 года
nevile
138 / / 05.01.2007
Ну неужели никто не сталкивался с такой проблемой.
10
23 июля 2007 года
Freeman
3.2K / / 06.03.2004
FileAge не пробовал?
2.0K
24 июля 2007 года
nevile
138 / / 05.01.2007
Он возвращяет время создание файла а мне именно надо время последнего изменения
15K
24 июля 2007 года
osx
78 / / 20.07.2007
Мож найдешь че полезное в ентом юните... Не мой код, но юзаю с радостью
Вот функция:
 
Код:
function TFileInfo.LastWritten : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftLastWriteTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

Вот весь юнит
Код:
unit FileInfo;

interface

uses
  forms, shellapi, windows, sysutils;

type
  EFileInfo = exception;
  TLangInfoBuffer = array [1..4] of SmallInt;
  TFileInfo = class
  private
    f : TSearchRec;
    fVerBlk : TVSFixedFileInfo;
    fFileName : string;
    function GetFileVersion( AFileName : string ) : boolean;
  public
    constructor Create( AFileName : string ); // Создаём объект
    destructor Destroy; override;
    function Execute : integer; // Открывает файл в программе, связанной с ним
    function VersionString : string; // Версия файла. Строка пустая, если строка не найдена
    function OS : string; // Операционная система
    function Path : string; // Путь файла
    function FileName : string; // Имя файла
    function name : string; // Имя файла без расширения
    function DosFileName : string; // Имя файла в DOS
    function FileExt : string; // Расширение файла
    function FileType : string; // Тип файла
    function FileSize : longint; // Размер файла
    function isDebugBuild : boolean; // True если флаг отладки (debug build) установлен
    function isPreRelease : boolean; // True если флаг prerelease установлен
    function isPrivateBuild : boolean; // True если флаг private установлен
    function isSpecialBuild : boolean; // True если флаг special build установлен
    function isDirectory : boolean; // True если файл является директорией
    function isHidden : boolean; // True если файл является скрытым (hidden)
    function isSystemFile : boolean; // True если файл является системным
    function isVolumeId : boolean; // True если файл является меткой тома
    function isArchive : boolean; // True если файл является архивом
    function CreationTime : TDateTime; // Время создания файла
    function LastAccessed : TDateTime; // Время последнего доступа к файлу
    function LastWritten : TDateTime; // Время последней записи в файл
end;

implementation

constructor TFileInfo.Create(AFileName: string);
var
  ret: integer;
begin
  inherited Create;
  fFileName := AFileName;
  ret := FindFirst( AFileName, faReadOnly + faHidden+ faSysFile +
    faVolumeID + faDirectory + faArchive + faAnyFile, f );
  if ret <> 0 then
    SysUtils.RaiseLastWin32Error;
end;

destructor TFileInfo.Destroy;
begin
  FindClose( f );
end;

function TFileInfo.GetFileVersion(AFileName: string): boolean;
var
  InfoSize, puLen: DWord;
  Pt, InfoPtr: Pointer;
begin
  InfoSize := GetFileVersionInfoSize( PChar(AFileName), puLen );
  fillchar( fVerBlk, sizeof(TVSFixedFileInfo), 0);
  if InfoSize > 0 then
  begin
    GetMem(Pt,InfoSize);
    GetFileVersionInfo( PChar(AFileName), 0, InfoSize, Pt);
    VerQueryValue(Pt,'\',InfoPtr,puLen);
    move(InfoPtr^, fVerBlk, sizeof(TVSFixedFileInfo) );
    FreeMem(Pt);
    result := true;
  end
  else
    result := false;
end;

function TFileInfo.VersionString: string;
begin
  if GetFileVersion( fFileName ) then
    result := Format('%u.%u.%u.%u',
    [HiWord(fVerBlk.dwProductVersionMS),
    LoWord(fVerBlk.dwProductVersionMS),
    HiWord(fVerBlk.dwProductVersionLS),
    LoWord(fVerBlk.dwProductVersionLS)])
  else
    result := '';
end;

function TFileInfo.isDebugBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_DEBUG) <> 0
end;

function TFIleInfo.isPreRelease : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_PRERELEASE) <> 0
end;

function TFIleInfo.isPrivateBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_PRIVATEBUILD) <> 0
end;

function TFIleInfo.isSpecialBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_SPECIALBUILD) <> 0
end;

function TFileInfo.OS : string;
begin
  if GetFileVersion( fFileName ) then
    case fVerBlk.dwFileOS of
      VOS_DOS_WINDOWS16 : result := 'MS-DOS or 16 bit Windows';
      VOS_DOS_WINDOWS32 : result := '32 bit Windows';
      VOS_OS216_PM16 : result := '16 bit OS/2';
      VOS_OS232_PM32 : result := '32 bit OS/2';
      VOS_NT_WINDOWS32 : result := 'Win32 or Windows NT';
      else
        result := 'Unknown OS';
    end
  else
    result := '';
end;

function TFileInfo.FileType : string;
var
  S: string;
begin
  S := '';
  if GetFileVersion( fFileName ) then
  begin
    case fVerBlk.dwFileType of
      VFT_APP : S := 'Application';
      VFT_DLL : S := 'Dynamic Link Library (DLL)';
      VFT_DRV :
      begin
        S := 'Device Driver - ';
        case fVerBlk.dwFileSubtype of
          VFT2_DRV_PRINTER : S := S + 'Printer';
          VFT2_DRV_KEYBOARD : S := S + 'Keyboard';
          VFT2_DRV_LANGUAGE : S := S + 'Language';
          VFT2_DRV_DISPLAY : S := S + 'Display';
          VFT2_DRV_MOUSE : S := S + 'Mouse';
          VFT2_DRV_NETWORK : S := S + 'Network';
          VFT2_DRV_SYSTEM : S := S + 'System';
          VFT2_DRV_INSTALLABLE : S := S + 'Installable';
          VFT2_DRV_SOUND : S := S + 'Sound';
          else
            S := S + 'Unknown';
        end;
      end;
      VFT_FONT :
      begin
        S := 'Font File - ';
        case fVerBlk.dwFileSubType of
          VFT2_FONT_RASTER : S := S + 'Raster';
          VFT2_FONT_VECTOR : S := S + 'Vector';
          VFT2_FONT_TRUETYPE : S := S + 'TrueType';
          else
            S := S + 'Unknown';
        end;
      end;
      VFT_VXD : S := 'Virtual Device';
      VFT_STATIC_LIB : S := 'Static Link Library';
      else
        S := 'Unknown File Type';
    end;
  end;
  Result := S;
end;

function TFileInfo.Path : string;
begin
  result := ExtractFilePath( fFileName );
end;

function TFileInfo.FileName : string;
begin
  result := ExtractFileName( fFileName );
end;

function TFileInfo.name : string;
begin
  if Pos( FileExt, FileName ) > 0 then
    result := Copy( FileName, 0, pos( FileExt, FileName )-1 )
  else
    result := FileName;
end;

function TFileInfo.DosFileName : string;
begin
  result := StrPas( f.FindData.cAlternateFileName )
end;

function TFileInfo.FileExt : string;
begin
  result := ExtractFileExt( fFileName );
end;

function TFileInfo.isDirectory : boolean;
begin
  result := f.Attr and faDirectory = faDirectory;
end;

function TFileInfo.isHidden : boolean;
begin
  result := f.Attr and faHidden = faHidden;
end;

function TFileInfo.isSystemFile : boolean;
begin
  result := f.Attr and faSysFile = faSysFile;
end;

function TFileInfo.isVolumeId : boolean;
begin
  result := f.Attr and faVolumeId = faVolumeId;
end;

function TFileInfo.isArchive : boolean;
begin
  result := f.Attr and faArchive = faArchive;
end;

function TFileInfo.FileSize : longint;
begin
  result := f.Size;
end;

function TFileInfo.CreationTime : TDateTime;
var
  LTime: TFileTime;
  Systemtime: TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftCreationTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

function TFileInfo.LastAccessed : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftLastAccessTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

function TFileInfo.LastWritten : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftLastWriteTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

function TFileInfo.Execute : integer;
begin
  result := shellapi.ShellExecute( Application.Handle, 'open',
    pChar( fFileName ), '', pChar(Path), SW_SHOWDEFAULT );
  case result of
    0 :
      raise Exception.Create( 'Недостаточно памяти или ресурсов.' );
    ERROR_FILE_NOT_FOUND :
      raise Exception.Create( 'Указанный файл не найден.' );
    ERROR_PATH_NOT_FOUND :
      raise Exception.Create( 'Указанный путь не найден.' );
    ERROR_BAD_FORMAT :
      raise Exception.Create( 'Ошибка файла .EXE (не -Win32 .EXE или ошибка ' + 'в .EXE).' );
    SE_ERR_ACCESSDENIED :
      raise Exception.Create( 'Доступ к файлу запрещён.' );
    SE_ERR_ASSOCINCOMPLETE :
      raise Exception.Create( 'The filename association is incomplete or invalid.' );
    SE_ERR_DDEBUSY :
      raise Exception.Create( 'Транзакция DDE не может быть завершена, потому что ' +
      'другая транзакция DDE находится в процессе выполнения.' );
    SE_ERR_DDEFAIL :
      raise Exception.Create( 'Ошибка транзакции DDE.' );
    SE_ERR_DDETIMEOUT :
      raise Exception.Create( 'DDE транзакция не может быть завершина из-за тайм-аута.' );
    SE_ERR_DLLNOTFOUND :
      raise Exception.Create( 'Указанная dynamic-link library не найдена.' );
    SE_ERR_NOASSOC :
      raise Exception.Create( 'Не найдено приложение связанной с данным расширением файла.' );
    SE_ERR_OOM :
      raise Exception.Create( 'Недостаточно памяти для завершения операции.' );
    SE_ERR_SHARE :
      raise Exception.Create( 'Файл используется другим приложением.' );
    else
  end;
end;

end.
2.0K
24 июля 2007 года
nevile
138 / / 05.01.2007
такой код я то же находил пытался с ним разобраться но не получилось.
Кто еще что подскажет?
Сейчас разбираюсь с функцией GetFileTime. Может кто-нибудь сказать что-нить внятное по поводу этой функции и как ее использовать для получения даты последнего изменения файла?
15K
25 июля 2007 года
osx
78 / / 20.07.2007
Цитата: nevile
такой код я то же находил пытался с ним разобраться но не получилось.
Кто еще что подскажет?
Сейчас разбираюсь с функцией GetFileTime. Может кто-нибудь сказать что-нить внятное по поводу этой функции и как ее использовать для получения даты последнего изменения файла?



Странно, у меня этот код работает без вопросов...

2.0K
25 июля 2007 года
nevile
138 / / 05.01.2007
У меня он сразу не принимает название функции: TFileInfo.LastWritten
15K
25 июля 2007 года
osx
78 / / 20.07.2007
Не пробывал сохранить юнит и заинклудить его в юзесах, а потом создать потомок от ТФайлИнфо? все прекрасно работает.
Пример писалсо буквально 2 минуты...
Код:
var
  Form1: TForm1;
  intr : TFileInfo;
implementation

{$R *.dfm}
uses Fileinfo; {файлинфо тот самый юнит, сохранил в папку}

procedure TForm1.Button1Click(Sender: TObject);
var
bl : TDateTime;
begin
intr:= TFileInfo.Create('1.txt');
bl:=intr.LastWritten;
form1.Caption:= TimeToStr(bl);
intr.Free;
end;
257
25 июля 2007 года
kosfiz
1.6K / / 18.09.2005
вот и использованием GetFileTime:
Код:
function SFmt(const S: String; Width: Byte): String;
begin
  if Length(S) < Width then
    Result := StringOfChar('0', Width - Length(S)) + S
  else Result:=S;
end;

function GetFileLastWriteTime(FileName: string):string;
var
FTLastWriteTime, LFTLastWriteTime: FILETIME;
STLastWriteTime: SYSTEMTIME;
DFile:DWORD;
begin
DFile:=CreateFile(PChar(FileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
if DFile<>INVALID_HANDLE_VALUE then
  begin
    GetFileTime(DFile, Nil, Nil, @FTLastWriteTime);
    FileTimeToLocalFileTime(FTLastWriteTime, LFTLastWriteTime);
    FileTimeToSystemTime(LFTLastWriteTime, STLastWriteTime);
    CloseHandle(DFile);
    With STLastWriteTime do
      Result:=SFmt(IntToStr(wDay),2)+'.'+SFmt(IntToStr(wMonth),2)+'.'+SFmt(IntToStr(wYear),2)+' '+SFmt(IntToStr(wHour),2)+':'+SFmt(IntToStr(wMinute),2)+':'+SFmt(IntToStr(wSecond),2);
  end
else
  Result:='Error: file not found!';
end;

а вот еще вариант: http://forum.codenet.ru/showpost.php?p=179861&postcount=6
2.0K
25 июля 2007 года
nevile
138 / / 05.01.2007
kosfiz снова спасибо тебе. выручил в который раз. Немного переписав свой предыдущий код и подогнав его под этот получил что нужно!!!
вот собственно что получил, может кому после пригодится:
Код:
function SFmt(const S: String; Width: Byte): String;
begin
  if Length(S) < Width then
    Result := StringOfChar('0', Width - Length(S)) + S
  else Result:=S;
end;

//ПОЛУЧЕНИЕ ДАТЫ ИЗМЕНЕНИЯ ФАЙЛА
function GetFileDate(FileName: string): string;

var
  FHandle: Integer;
  FTLastWriteTime, LFTLastWriteTime: FILETIME;
  STLastWriteTime: SYSTEMTIME;
begin
  FHandle := FileOpen(FileName, 0);
  try
   GetFileTime(FHandle, Nil, Nil, @FTLastWriteTime);
    FileTimeToLocalFileTime(FTLastWriteTime, LFTLastWriteTime);
    FileTimeToSystemTime(LFTLastWriteTime, STLastWriteTime);
    With STLastWriteTime do
      Result:=SFmt(IntToStr(wDay),2)+'.'+SFmt(IntToStr(wMonth),2)+'.'+SFmt(IntToStr(wYear),2)+' '+SFmt(IntToStr(wHour),2)+':'+SFmt(IntToStr(wMinute),2)+':'+SFmt(IntToStr(wSecond),2);
  finally
    FileClose(FHandle);
  end;
end;


Теперь возник еще вопрос, но запостю его как отдельную тему потому что будет интересен многим я думаю.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог