Contributor: SWAG SUPPORT TEAM unit Disques; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, FileCtrl,LZExpand,ShellAPI; // Constants const (* drive type *) _drive_not_exist = 255; _drive_floppy = 1; _drive_hard = 2; _drive_network = 3; _drive_CDRom = 4; _drive_RAM = 5; (* directory option *) _directory_recurrent = 1; _directory_not_recurrent = 0; _directory_force = 1; _directory_not_force = 0; _directory_clear_file = 1; _directory_not_clear_file = 0; (* file error *) _File_Unable_To_Delete = 10; _File_Copied_Ok = 0; _File_Already_Exists = 1; _File_Bad_Source = 2; _File_Bad_Destination = 3; _File_Bad_Source_Read = 4; _File_Bad_Destination_Read = 5; (* copy switch *) _File_copy_Overwrite = 1; // Drives function _Drive_Type (_Drive : char) : byte; function _Drive_As_Disk (_Drive: Char): Boolean; function _Drive_Size (_Drive : char) : longint; function _Drive_Free (_Drive : char) : longint; // Directories function _Directory_Exist (_Dir : string) : boolean; function _Directory_Create (_Dir : string) : boolean; function _Directory_Delete (_Dir : string;ClearFile : byte) : boolean; function _Directory_Delete_Tree (_Dir : string; ClearFile : byte) : boolean; function _Directory_Rename (_Dir,_NewDir : string) : boolean; // Files function _File_Exist (_File : string) : boolean; function _File_Delete (_File : string) : boolean; function _File_Recycle (_File : string) : boolean; function _File_Rename (_File,_NewFile : string;_Delete : byte) : boolean; function _File_Copy_UnCompress (FromFile,ToFile : string;Switch : byte) : byte; function _File_Copy(source,dest: String): Boolean; function _File_Move (_Source,_Destination : string) : boolean; function _File_Get_Attrib (_File : string) : byte; function _File_Set_Attrib (_File : string;_Attrib : byte) : boolean; function _File_Get_Date (_File : string) : string; function _File_Set_Date (_File,_Date : string) : boolean; function _File_Get_Size (_File : string) : longint; function _File_Start (AppName,AppParams,AppDir : string) : integer; // Miscellaneous function _Get_WindowsDir : string; function _Get_SystemDir : string; function _Get_TempDir : string; function _Get_Apps_Dir (ExeName : PChar) : string; function _Get_Apps_Drive (ExeName : PChar) : string; function _Get_WindowsVer : real; function _Get_WindowsBuild : real; function _Get_WindowsPlatform : string; function _Get_WindowsExtra : string; implementation (**********) (* drives *) (**********) (* type of drive *) function _Drive_Type (_Drive : char) : byte; var i: integer; c : array [0..255] of char; begin _Drive := upcase (_Drive); if not (_Drive in ['A'..'Z']) then Result := _drive_not_exist else begin strPCopy (c,_Drive + ':\'); i := GetDriveType (c); case i of DRIVE_REMOVABLE: result := _drive_floppy; DRIVE_FIXED : result := _drive_hard; DRIVE_REMOTE : result := _drive_network; DRIVE_CDROM : result := _drive_CDRom; DRIVE_RAMDISK : result := _drive_RAM; else result := _drive_not_exist; end; end; end; (* test is a disk is in drive *) function _Drive_As_Disk (_Drive: Char): Boolean; var ErrorMode: Word; begin _Drive := UpCase(_Drive); if not (_Drive in ['A'..'Z']) then raise EConvertError.Create ('Not a valid drive letter'); ErrorMode := SetErrorMode (SEM_FailCriticalErrors); try Application.ProcessMessages; Result := (DiskSize ( Ord(_Drive) - Ord ('A') + 1) <> -1); finally SetErrorMode(ErrorMode); Application.ProcessMessages; end; end; (* size of drive *) function _Drive_Size (_Drive : char) : longint; var ErrorMode : word; begin _Drive := upcase (_Drive); if not (_Drive in ['A'..'Z']) then raise EConvertError.Create ('Not a valid drive letter'); ErrorMode := SetErrorMode (SEM_FailCriticalErrors); try Application.ProcessMessages; Result := DiskSize ( Ord(_Drive) - Ord ('A') + 1); finally SetErrorMode (ErrorMode); end; end; (* free space in drive *) function _Drive_Free (_Drive : char) : longint; var ErrorMode : word; begin _Drive := upcase (_Drive); if not (_Drive in ['A'..'Z']) then raise EConvertError.Create ('Not a valid drive letter'); ErrorMode := SetErrorMode (SEM_FailCriticalErrors); try Application.ProcessMessages; Result := DiskFree ( Ord(_Drive) - Ord ('A') + 1); finally SetErrorMode (ErrorMode); end; end; (***************) (* directories *) (***************) (* directory exists or not *) function _Directory_Exist (_Dir : string) : boolean; VAR OldMode : Word; OldDir : String; BEGIN Result := True; GetDir(0, OldDir); OldMode := SetErrorMode(SEM_FAILCRITICALERRORS); try try ChDir(_Dir); except ON EInOutError DO Result := False; end; finally ChDir(OldDir); SetErrorMode(OldMode); end; END; (* create a directory enven if parent does not exists *) function _Directory_Create (_Dir : string) : boolean; begin ForceDirectories(_Dir); Result := _Directory_Exist (_Dir); end; (* delete a directory *) function _Directory_Delete (_Dir : string;ClearFile : byte) : boolean; begin if _Directory_Exist (_Dir) then Result := RemoveDir (_Dir) else Result := false; end; (* delete a tree *) function _directory_delete_tree (_Dir : string; ClearFile : byte) : boolean; var SearchRec : TSearchRec; Erc : Word; begin if _Directory_Exist (_Dir) then begin Try ChDir (_Dir); FindFirst('*.*',faAnyFile,SearchRec); Erc := 0; while Erc = 0 do begin if ((SearchRec.Name <> '.' ) and (SearchRec.Name <> '..')) then begin if (SearchRec.Attr and faDirectory > 0) then _Directory_Delete_Tree (SearchRec.Name,ClearFile) else if ClearFile = 1 then _File_Delete (SearchRec.Name); end; Erc := FindNext (SearchRec); end; FindClose (SearchRec); Application.ProcessMessages; finally if Length(_Dir) > 3 then ChDir ('..' ); Result := RemoveDir (_Dir); end; end else (* not exists *) Result := false; end; (* Renamme a directory *) function _Directory_Rename (_Dir,_NewDir : string) : boolean; var SearchRec : TSearchRec; Erc : Word; f : file; o : string; begin if _Directory_Exist (_Dir) then begin Try (* just name of directory *) o := _dir; Delete (o,1,2); (* remove drive and : *) if o [1] = '\' then delete (o,1,1); (* remove \ at begin *) if o [length (o)] = '\' then o := copy (o,1,length (o)-1); (* delete \ at end *) ChDir (_Dir); ChDir ('..'); FindFirst('*.*',faAnyFile,SearchRec); Erc := 0; while Erc = 0 do begin if ((SearchRec.Name <> '.' ) and (SearchRec.Name <> '..')) then begin if (SearchRec.Attr and faDirectory > 0) then begin if SearchRec.Name = o then begin assignfile (f,SearchRec.Name); {$I-}; rename (F,_NewDir); {I+}; result := (ioresult = 0); end; end; end; Erc := FindNext (SearchRec); end; Application.ProcessMessages; finally if Length(_Dir) > 3 then ChDir ('..' ); end; FindClose (SearchRec); end else (* not exists *) Result := false; end; (*********) (* files *) (*********) (* file exists or not *) function _File_Exist (_File : string) : boolean; begin _File_Exist := FileExists(_File); end; (* delete a file remove -r if needed *) function _File_Delete (_File : string) : boolean; begin if FileExists (_File) then begin _File_Set_Attrib (_File,0); Result := DeleteFile (_File); end else Result := false; end; (* send a file to recycle *) function _File_Recycle(_File : TFilename): boolean; var Struct: TSHFileOpStruct; pFromc: array[0..255] of char; Resul : integer; begin if not FileExists(_File) then begin _File_Recycle := False; exit; end else begin fillchar(pfromc,sizeof(pfromc),0); StrPcopy(pfromc,expandfilename(_File)+#0#0); Struct.wnd := 0; Struct.wFunc := FO_DELETE; Struct.pFrom := pFromC; Struct.pTo := nil; Struct.fFlags:= FOF_ALLOWUNDO or FOF_NOCONFIRMATION ; Struct.fAnyOperationsAborted := false; Struct.hNameMappings := nil; Resul := ShFileOperation(Struct); _File_Recycle := (Resul = 0); end; end; (* renamme a file, delete if needed *) function _File_Rename (_File,_NewFile : string;_Delete : byte) : boolean; var f : file; begin if FileExists (_File) then begin if FileExists (_NewFile) then begin if _Delete = 0 then Result := false else _File_Delete (_NewFile); end; assignfile (f,_File); {$I-}; Rename (f,_NewFile); {$I+}; Result := (ioresult = 0); end else Result := false; end; (* copy a file *) function _File_Copy_UnCompress (FromFile,ToFile : string;Switch : byte) : byte; var Tmp : integer; FromF, ToF: file; NumRead, NumWritten: Word; iHandle : Integer; iNewHandle : Integer; iReturn : Integer; iLongReturn : LongInt; pFrom : Array[0..256] of Char; pTo : Array[0..256] of Char; begin Tmp := 0; If (FileExists (ToFile)) and (Switch = 0) then Tmp := 1 else begin StrPCopy( pFrom, FromFile ); iReturn := GetExpandedName( pFrom, pTo ); if iReturn = -1 then Tmp := 2 else begin if iReturn = -2 then Tmp := 3 else begin if ( StrEnd( pTo ) - pTo ) > 0 then begin ToFile := ExtractFilePath( ToFile ) + ExtractFileName( strPas( pTo ) ); iHandle := FileOpen( FromFile, fmShareDenyWrite ); LZInit (iHandle); if iHandle < 1 then Tmp := 2 else begin iNewHandle := FileCreate( ToFile ); if iNewHandle < 1 then Tmp := 3 else begin iLongReturn := LZCopy( iHandle , iNewHandle ); if iLongReturn = LZERROR_UNKNOWNALG then Tmp := 5 else begin FileClose( iHandle ); FileClose( iNewHandle ); LZClose (iHandle); end; end; end; end else Tmp := 3; end end; end; _File_Copy_UnCompress := Tmp; end; (* just copy a file *) function _File_Copy(source,dest: String): Boolean; var fSrc,fDst,len: Integer; size: Longint; buffer: packed array [0..2047] of Byte; begin if pos ('\\',source) <> 0 then delete (source,pos ('\\',source),1); if pos ('\\',dest) <> 0 then delete (dest,pos ('\\',dest),1); Result := False; if source <> dest then begin fSrc := FileOpen(source,fmOpenRead); if fSrc >= 0 then begin size := FileSeek(fSrc,0,2); FileSeek(fSrc,0,0); fDst := FileCreate(dest); if fDst >= 0 then begin while size > 0 do begin len := FileRead(fSrc,buffer,sizeof(buffer)); FileWrite(fDst,buffer,len); size := size - len; end; FileSetDate(fDst,FileGetDate(fSrc)); FileClose(fDst); FileSetAttr(dest,FileGetAttr(source)); Result := True; end; FileClose(fSrc); end; end; end; (* move a file *) function _File_Move (_Source,_Destination : string) : boolean; var Tmp : boolean; begin tmp := _File_Copy (_Source,_Destination); if Tmp = true then if _File_Delete (_Source) = true then Tmp := true else Tmp := false; Result := Tmp; end; (* Get file attributes *) function _File_Get_Attrib (_File : string) : byte; var Tmp : byte; Att : integer; begin if FileExists (_File) then begin Att := FileGetAttr (_File); if Att <> -1 then begin Tmp := 0; if (Att AND faReadOnly) = faReadOnly then Tmp := Tmp + 1; if (Att AND faHidden) = faHidden then Tmp := Tmp + 2; if (Att AND faSysFile) = faSysFile then Tmp := Tmp + 4; if (Att AND faArchive) = faArchive then Tmp := Tmp + 8; Result := Tmp; end else Result := 255; end else Result := 255; end; (* Set file attributes *) function _File_Set_Attrib (_File : string;_Attrib : byte) : boolean; var Tmp : integer; begin if FileExists (_File) then begin Tmp := 0; if _Attrib and 1 = 1 then Tmp := tmp OR faReadOnly; if _Attrib and 2 = 2 then Tmp := tmp OR faHidden; if _Attrib and 4 = 4 then Tmp := tmp OR faSysFile; if _Attrib and 8 = 8 then Tmp := tmp OR faArchive; Result := FileSetAttr (_File,Tmp) = 0; end else Result := false end; (* Get datestamp of file *) function _File_Get_Date (_File : string) : string; var f : file; Hdl : integer; Tmp : string; Dte : integer; Dat : TDateTime; begin Tmp := ''; Hdl := FileOpen(_File, fmOpenRead or fmShareDenyNone); if Hdl > 0 then begin Dte := FileGetDate (Hdl); FileClose (Hdl); Dat := FileDateToDateTime (Dte); Tmp := DateToStr (Dat); while pos ('/',Tmp) <> 0 do delete (Tmp,pos ('/',Tmp),1); if length (tmp) > 6 then delete (Tmp,5,2); end; Result := Tmp; end; (* Set datestamp of file *) function _File_Set_Date (_File,_Date : string) : boolean; var f : file; Hdl : integer; Dte : integer; Dat : TDateTime; Att : integer; begin Att := _File_Get_Attrib (_File); if (Att AND 1) <> 1 then Att := 0 else _File_Set_Attrib (_File,0); Hdl := FileOpen(_File, fmOpenReadWrite or fmShareDenyNone); if Hdl > 0 then begin if length (_Date) < 8 then Insert ('19',_Date,5); if pos ('/',_Date) = 0 then _Date := copy (_Date,1,2) + '/' + copy (_Date,3,2) + '/' + copy (_Date,5,4); Dat := StrToDateTime (_Date); Dte := DateTimeToFileDate (Dat); Result := FileSetDate (Hdl,Dte) = 0; FileClose (Hdl); if Att <> 0 then _File_Set_Attrib (_File,Att); end else begin if Att <> 0 then _File_Set_Attrib (_File,Att); Result := False; end; end; (* return size of a file *) function _File_Get_Size (_File : string) : longint; var f: file of Byte; a : integer; begin if FileExists (_File) then begin a := _File_Get_Attrib (_File); if (a AND 1) = 1 then _File_Set_Attrib (_File,0) else a := 0; AssignFile(f,_File); {$I-}; Reset(f); {$I+}; if ioresult = 0 then begin Result := FileSize(f); CloseFile(f); if a <> 0 then _File_Set_Attrib (_File,a); end else begin if a <> 0 then _File_Set_Attrib (_File,a); Result := -1; end; end else Result := -1; end; (* lancement d'une application *) function _File_Start (AppName,AppParams,AppDir : string) : integer; var Tmp : Integer; zFileName : array [0 .. 79] of char; zParams : array [0 .. 79] of char; zDir : array [0 .. 79] of Char; begin Tmp := 0; StrPCopy (zFileName,AppName); StrPCopy (zParams,AppParams); StrPCopy (zDir,AppDir); Tmp := ShellExecute (0,Nil,zFileName,zParams,zDir,1); _File_Start := Tmp; end; (*****************) (* miscellaneous *) (*****************) (* return Windows directory *) function _Get_WindowsDir : string; var Tmp : array [0 .. 255] of char; Ret : string; begin if GetWindowsDirectory (Tmp,255) <> 0 then begin Ret := StrPas (Tmp); if Ret [length (Ret)] = '\' then Ret := copy (Ret,1,length (Ret) - 1); Result := Ret; end else Result := ''; end; (* return Windows system directory *) function _Get_SystemDir : string; var Tmp : array [0 .. 255] of char; Ret : string; begin if GetSystemDirectory (Tmp,255) <> 0 then begin Ret := StrPas (Tmp); if Ret [length (Ret)] = '\' then Ret := copy (Ret,1,length (Ret) - 1); Result := Ret; end else Result := ''; end; (* return Windows Temp directory *) function _Get_TempDir : string; var Tmp : array [0 .. 255] of char; Ret : string; begin if GetTempPath (255,Tmp) <> 0 then begin Ret := StrPas (Tmp); if Ret [length (Ret)] = '\' then Ret := copy (Ret,1,length (Ret) - 1); Result := Ret; end else Result := ''; end; (* return application directory *) function _Get_Apps_Dir (ExeName : PChar) : string; var Hdl : THandle; Nam : PChar; Fil : array [0..255] of char; Siz : integer; Ret : integer; Pas : string; Pat : string [79]; begin Pat := ''; Hdl := GetModuleHandle (ExeName); Ret := GetModuleFileName (Hdl,Fil,Siz); Pas := StrPas (Fil); Pat := ExtractFilePath (Pas); Delete (Pat,1,2); if Pat [length (Pat)] = '\' then Pat := copy (Pat,1,length (Pat) - 1); Result := Pat; end; (* return dirve of current application *) function _Get_Apps_Drive (ExeName : PChar) : string; var Hdl : THandle; Nam : PChar; Fil : array [0..255] of char; Siz : integer; Ret : integer; Pas : string; Drv : string [02]; begin Drv := ''; Hdl := GetModuleHandle (ExeName); Ret := GetModuleFileName (Hdl,Fil,Siz); Pas := StrPas (Fil); Drv := ExtractFilePath (Pas); _Get_Apps_Drive := Drv; end; (* return windows version as a real *) function _Get_WindowsVer : real; var tempo : string; Temp : real; err : integer; struct : TOSVersionInfo; begin struct.dwOSVersionInfoSize := sizeof (Struct); struct.dwMajorVersion := 0; struct.dwMinorVersion := 0; GetVersionEx (Struct); Tempo := inttostr (Struct.dwMajorVersion) + '.' + inttostr (Struct.dwMinorVersion); val (tempo,temp,err); Result := Temp; end; (* return type of platform *) function _Get_WindowsPlatform : string; var tempo : string; Temp : string; err : integer; struct : TOSVersionInfo; begin struct.dwOSVersionInfoSize := sizeof (Struct); struct.dwPlatformId := 0; GetVersionEx (Struct); case struct.dwPlatformid of ver_platform_win32s : temp := 'Win32S'; ver_platform_win32_windows : temp := 'Win32'; ver_platform_win32_nt : temp := 'WinNT'; end; Result := Temp; end; (* get extra information *) function _Get_WindowsExtra : string; var tempo : string; Temp : string; err : integer; struct : TOSVersionInfo; begin struct.dwOSVersionInfoSize := sizeof (Struct); struct.dwMajorVersion := 0; struct.dwMinorVersion := 0; struct.dwBuildNumber := 0; struct.dwPlatformId := 0; GetVersionEx (Struct); Temp := ''; Temp := strPas (Struct.szCSDVersion); Result := Temp; end; (* return windows build as a real *) function _Get_WindowsBuild : real; var tempo : string; Temp : real; err : integer; struct : TOSVersionInfo; begin struct.dwOSVersionInfoSize := sizeof (Struct); struct.dwBuildNumber := 0; GetVersionEx (Struct); tempo := inttostr (struct.dwBuildNumber AND $0000FFFF); val (tempo,temp,err); Result := Temp; end; begin end.