We don't display ads so we rely on your Bitcoin donations to 1KWEk9QaiJb2NwP5YFmR24LyUBa4JyuKqZ
Post date: Oct 17, 2010 11:05:06 PM
{ Delphi File Accesss by Aphex unremote@knology.net}unit FileUnit;interfaceuses Windows;type LongRec = packed record case Integer of 0: (Lo, Hi: Word); 1: (Words: array [0..1] of Word); 2: (Bytes: array [0..3] of Byte); end; TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: string; ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData; end; TFileManager = class(TObject) private public DriveCount: integer; DirectoryCount: integer; FileCount: integer; DriveList: array of string; DirectoryList: array of string; FileList: array of string; procedure ListDrives; procedure ListDirectories(RootDirectory: string); procedure ListFiles(RootDirectory: string); function IsReadOnly(FileName: string): boolean; function IsHidden(FileName: string): boolean; function IsSystemFile(FileName: string): boolean; function IsVolumeID(FileName: string): boolean; function IsDirectory(FileName: string): boolean; function IsArchive(FileName: string): boolean; function FileSize(FileName: string): dword; end;const faReadOnly = $00000001; faHidden = $00000002; faSysFile = $00000004; faVolumeID = $00000008; faDirectory = $00000010; faArchive = $00000020; faAnyFile = $0000003F;function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;function FindNext(var F: TSearchRec): Integer;procedure FindClose(var F: TSearchRec);implementationfunction IntToStr(I: integer):string;var v1: string;begin Str(I, v1); Result := v1;end;function StrLen(const Str: PChar): Cardinal; assembler;asm MOV EDX,EDI MOV EDI,EAX MOV ECX,0FFFFFFFFH XOR AL,AL REPNE SCASB MOV EAX,0FFFFFFFEH SUB EAX,ECX MOV EDI,EDXend;procedure FindClose(var F: TSearchRec);begin if F.FindHandle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(F.FindHandle); F.FindHandle := INVALID_HANDLE_VALUE; end;end;function FindMatchingFile(var F: TSearchRec): Integer;var LocalFileTime: TFileTime;begin with F do begin while FindData.dwFileAttributes and ExcludeAttr <> 0 do if not FindNextFile(FindHandle, FindData) then begin Result := GetLastError; Exit; end; FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi, LongRec(Time).Lo); Size := FindData.nFileSizeLow; Attr := FindData.dwFileAttributes; Name := FindData.cFileName; end; Result := 0;end;function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;const faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;begin F.ExcludeAttr := not Attr and faSpecial; F.FindHandle := FindFirstFile(PChar(Path), F.FindData); if F.FindHandle <> INVALID_HANDLE_VALUE then begin Result := FindMatchingFile(F); if Result <> 0 then FindClose(F); end else Result := GetLastError;end;function FindNext(var F: TSearchRec): Integer;begin if FindNextFile(F.FindHandle, F.FindData) then Result := FindMatchingFile(F) else Result := GetLastError;end;function TFileManager.FileSize(FileName: string): dword;var FileHandle: THandle;begin FileHandle := CreateFile(pchar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_NO_BUFFERING, 0); Result := GetFileSize(FileHandle, nil); CloseHandle(FileHandle);end;procedure TFileManager.ListDrives;var Buffer: PChar; PBuffer: PChar;begin DriveCount := -1; GetMem(Buffer, 256); try if GetLogicalDriveStrings(256, Buffer) <> 0 then begin PBuffer := Buffer; while PBuffer^ <> #0 do begin Inc(DriveCount); SetLength(DriveList, DriveCount + 1); DriveList[DriveCount] := string(PBuffer); Inc(PBuffer, StrLen(PBuffer) + 1); end; end; finally FreeMem(Buffer, 256); Inc(DriveCount); end;end;procedure TFileManager.ListDirectories(RootDirectory: string);var SearchRec: TSearchRec; iLoop: integer;begin DirectoryCount := -1; if Copy(RootDirectory, Length(RootDirectory), 1) <> '\' then begin RootDirectory := RootDirectory + '\'; end; iLoop := FindFirst(RootDirectory + '*', faAnyFile, SearchRec); while iLoop = 0 do begin if ((SearchRec.Name <> '.') and (SearchRec.Name <> '..')) then begin if ((SearchRec.Attr and faDirectory) <> 0) then begin Inc(DirectoryCount); SetLength(DirectoryList, DirectoryCount + 1); DirectoryList[DirectoryCount] := RootDirectory + SearchRec.Name; end; end; iLoop := FindNext(SearchRec); end; FindClose(SearchRec); Inc(DirectoryCount);end;procedure TFileManager.ListFiles(RootDirectory: string);var SearchRec: TSearchRec; iLoop: integer;begin FileCount := -1; if Copy(RootDirectory, Length(RootDirectory), 1) <> '\' then begin RootDirectory := RootDirectory + '\'; end; iLoop := FindFirst(RootDirectory + '*', faAnyFile, SearchRec); while iLoop = 0 do begin if ((SearchRec.Name <> '.') and (SearchRec.Name <> '..')) then begin if ((SearchRec.Attr and faDirectory) = 0) then begin Inc(FileCount); SetLength(FileList, FileCount + 1); FileList[FileCount] := RootDirectory + SearchRec.Name; end; end; iLoop := FindNext(SearchRec); end; FindClose(SearchRec); Inc(FileCount);end;function TFileManager.IsReadOnly(FileName: string): boolean;begin Result := False; if (GetFileAttributes(pchar(FileName)) and faReadOnly) <> 0 then Result := True;end;function TFileManager.IsHidden(FileName: string): boolean;begin Result := False; if (GetFileAttributes(pchar(FileName)) and faHidden) <> 0 then Result := True;end;function TFileManager.IsSystemFile(FileName: string): boolean;begin Result := False; if (GetFileAttributes(pchar(FileName)) and faSysFile) <> 0 then Result := True;end;function TFileManager.IsVolumeID(FileName: string): boolean;begin Result := False; if (GetFileAttributes(pchar(FileName)) and faVolumeID) <> 0 then Result := True;end;function TFileManager.IsDirectory(FileName: string): boolean;begin Result := False; if (GetFileAttributes(pchar(FileName)) and faDirectory) <> 0 then Result := True;end;function TFileManager.IsArchive(FileName: string): boolean;begin Result := False; if (GetFileAttributes(pchar(FileName)) and faArchive) <> 0 then Result := True;end;end.