unit unitFileOP; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; implementation function GetSys32Dir:String; var Sys32Dir: string; pSys32Dir: array[0..Max_Path] of char; begin GetSystemDirectory(pSys32Dir,Max_Path); Sys32Dir := String(pSys32Dir) + chr(92); Result := Sys32Dir; end; procedure MyFileCopy(const FromFile, ToFile: string); var FromF, ToF: file; NumRead, NumWritten: integer; Buf: array[1..2048] of Char; begin AssignFile(FromF, FromFile); Reset(FromF, 1); AssignFile(ToF, ToFile); Rewrite(ToF, 1); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; function GetExeFileVersion(fn: string; var ma, mi, r, b: integer): boolean; var buf, p: pChar; sver: ^VS_FIXEDFILEINFO; i: LongWord; begin i := GetFileVersionInfoSize(pchar(fn), i); new(sver); p := pchar(sver); GetMem(buf, i); ZeroMemory(buf, i); result := false; if GetFileVersionInfo(pchar(fn), 0, 4096, pointer(buf)) then if VerQueryValue(buf, '/', pointer(sver), i) then begin ma := sVer^.dwFileVersionMS shr 16; mi := sver^.dwFileVersionMS and $0000FFFF; r := sver^.dwFileVersionLS shr 16; b := sver^.dwFileVersionLS and $0000FFFF; result := true; end; Dispose(p); FreeMem(buf); end; function GetVersionString(const pFileName: string): string; var VerInfoSize: DWORD; VerInfo: Pointer; VerValueSize: DWORD; Dummy: DWORD; VerValue: PVSFixedFileInfo; begin Result := '0'; VerInfoSize := GetFileVersionInfoSize(PChar(pFileName), Dummy); if VerInfoSize = 0 then Exit; GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(pFileName), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, chr(92), Pointer(VerValue), VerValueSize); Result := IntToStr(VerValue^.dwFileVersionMS shr 16) + '.' + IntToStr(VerValue^.dwFileVersionMS and $FFFF) + '.' + IntToStr(VerValue^.dwFileVersionLS shr 16) + '.' + IntToStr(VerValue^.dwFileVersionLS and $FFFF); FreeMem(VerInfo); end; function GetFileVersion(const AFileName: string): string; var n, Len: DWORD; Buf: PChar; Value: Pointer; szName: array[0..255] of Char; Transstring: string; begin Len := GetFileVersionInfoSize(PChar(AFileName), n); if Len > 0 then begin Buf := AllocMem(Len); if GetFileVersionInfo(Pchar(AFileName), n, Len, Buf) then begin Value := nil; VerQueryValue(Buf, '/VarFileInfo/Translation', Value, Len); if Value <> nil then Transstring := IntToHex(MakeLong(HiWord(LongInt(Value^)), LoWord(LongInt(Value^))), 8); StrPCopy(szName, '/stringFileInfo/' + Transstring + '/FileVersion'); if VerQueryValue(Buf, szName, Value, Len) then Result := StrPas(Pchar(Value)); end; FreeMem(Buf, n); end; end; function GetFileSizeString(const pFileName: String):String; var FileHandle: integer; begin Result := '0'; FileHandle := FileOpen(pFileName, 0); Result := IntToStr(FileSeek(FileHandle, 0, 2)); FileClose(FileHandle); end; function GetFileModify(const FileName:string):TDateTime; var sr: TSearchRec; DT:Tdatetime; FileTime: TFileTime; DFT: DWORD; begin if findfirst(FileName,faanyfile,sr)=0 then begin FileTimeToLocalFileTime(SR.FINDdata.ftLastAccessTime, FileTime); FileTimeToDosDateTime(FileTime, LongRec(DFT).HI, LongRec(DFT).LO); DT:=filedatetodatetime(dft); Result:=DT; end end; procedure Fun_DeleteDir(sDirectory: string); stdcall; var sr: TSearchRec; sPath, sFile: string; begin if Copy(sDirectory, Length(sDirectory), 1) <> '/' then sPath := sDirectory + '/' else sPath := sDirectory; if SysUtils.FindFirst(sPath + '*.*', faAnyFile, sr) = 0 then begin repeat sFile := Trim(sr.Name); if sFile = '.' then Continue; if sFile = '..' then Continue; sFile := sPath + sr.Name; if (sr.Attr and faDirectory) <> 0 then Fun_DeleteDir(sFile) else if (sr.Attr and faAnyFile) = sr.Attr then begin try DeleteFile(PAnsiChar(sFile)); except ; end; end; until SysUtils.FindNext(sr) <> 0; SysUtils.FindClose(sr); end; try RemoveDir(sPath); except ; end; end; procedure RemoveNotNullDir(pPath: string); var search: TSearchRec; ret: integer; key: string; begin if pPath[Length(pPath)] <> '/' then pPath := pPath + '/'; key := pPath + '*.*'; ret := findFirst(key, faanyfile, search); while ret = 0 do begin if ((search.Attr and fadirectory) = faDirectory) then begin if (Search.Name <> '.') and (Search.name <> '..') then RemoveNotNullDir(pPath + Search.name); end else begin if ((search.attr and fadirectory) <> fadirectory) then begin deletefile(pPath + search.name); end; end; ret := FindNext(search); end; findClose(search); removedir(pPath); end; end.