Subversion Repositories autosfx

Rev

Rev 3 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit Functions;
  2.  
  3. interface
  4.  
  5. uses
  6.   Forms, Windows, Classes, SysUtils, ShellAPI,
  7.   ZipMstr19, ZmUtils19, ShlObj, ActiveX;
  8.  
  9. type
  10.   TLineBreak = (lbWindows, lbLinux, lbMac);
  11.  
  12. function RawFileCopy(ASrc, ADst: string): boolean;
  13. function ShellExecuteAndWait(FileName: string; Params: string): boolean;
  14. function FileSize(AFilename: string): int64;
  15. function LooksLikeDir(s: string): boolean;
  16. function GetTempDirectory: String;
  17. function NormalizeLineBreaks(s: string; mode: TLineBreak): string;
  18. function ExtractFileNameWithoutExt(const fil: string): string;
  19. function SearchNextFreeName(s: string; wantDir: boolean): string;
  20. function GetSpecialFolderPath(const Folder: integer): string;
  21. function IsExtractable(AFilename: string): boolean;
  22. function IsDirectoryWritable(const Dir: String): Boolean;
  23. function IsAtFlobbyDisk(AFileOrDir: string): boolean;
  24.  
  25. implementation
  26.  
  27. {$IFNDEF UNICODE}
  28. type
  29.   TCharSet = set of AnsiChar;
  30. {$ENDIF}
  31.  
  32. {$IFNDEF UNICODE}
  33. function CharInSet(C: AnsiChar; const CharSet: TCharSet): Boolean;// overload;
  34. begin
  35.   Result := c in CharSet;
  36. end;
  37. {$ENDIF}
  38.  
  39. function LooksLikeDir(s: string): boolean;
  40. begin
  41.   result := CharInSet(s[Length(s)], ['/', '\']);
  42. end;
  43.  
  44. function RawFileCopy(ASrc, ADst: string): boolean;
  45. var
  46.   SSrc, SDst: TFileStream;
  47. begin
  48.   DeleteFile(PChar(ADst));
  49.  
  50.   SSrc := TFileStream.Create(ASrc, fmOpenRead);
  51.   try
  52.     SDst := TFileStream.Create(ADst, fmCreate);
  53.     try
  54.       SDst.CopyFrom(SSrc, SSrc.Size);
  55.     finally
  56.       SDst.Free;
  57.     end;
  58.   finally
  59.     SSrc.Free;
  60.   end;
  61.  
  62.   result := true;
  63. end;
  64.  
  65. // http://www.delphipraxis.net/32234-shellexecuteandwait-status-abfragen.html
  66. // Modified. Now CONSOLE compatible and return false if ErrorLevel <> 0
  67. function ShellExecuteAndWait(FileName: string; Params: string): boolean;
  68. var
  69.   exInfo: TShellExecuteInfo;
  70.   Ph: DWORD;
  71.   lExitCode: DWord;
  72. begin
  73.   Try
  74.     FillChar(exInfo, SizeOf(exInfo), 0);
  75.     with exInfo do
  76.     begin
  77.       cbSize := SizeOf(exInfo);
  78.       fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
  79.       Wnd := GetActiveWindow();
  80.       FileName := ExpandUNCFileName(FileName);
  81.       ExInfo.lpVerb := 'open';
  82.       ExInfo.lpParameters := PChar(Params);
  83. //      ExInfo.lpDirectory := PChar(ExtractFilePath(FileName));
  84.       lpFile := PChar(FileName);
  85.       nShow := SW_SHOWNORMAL;
  86.     end;
  87.     if ShellExecuteEx(@exInfo) then
  88.     begin
  89.       Ph := exInfo.HProcess;
  90.     end
  91.     else
  92.     begin
  93.       WriteLn(SysErrorMessage(GetLastError));
  94.       Result := False;
  95.       Exit;
  96.     end;
  97.     while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do ;
  98.     (* begin
  99.       Application.ProcessMessages;
  100.     end; *)
  101.     GetExitCodeProcess(Ph, lExitCode);
  102.     Result := lExitCode = 0;
  103.     CloseHandle(Ph);
  104.   Except
  105.     Result := False;
  106.     Exit;
  107.   End;
  108. end;
  109.  
  110. function FileSize(AFilename: string): int64;
  111. var
  112.   s: TFileStream;
  113. begin
  114.   s := TFileStream.Create(AFilename, fmOpenRead or fmShareDenyWrite);
  115.   try
  116.     result := s.Size;
  117.   finally
  118.     s.Free;
  119.   end;
  120. end;
  121.  
  122. // http://www.cryer.co.uk/brian/delphi/howto_get_temp.htm
  123. function GetTempDirectory: String;
  124. var
  125.   tempFolder: array[0..MAX_PATH] of Char;
  126. begin
  127.   GetTempPath(MAX_PATH, @tempFolder);
  128.   result := StrPas(tempFolder);
  129. end;
  130.  
  131. function NormalizeLineBreaks(s: string; mode: TLineBreak): string;
  132. begin
  133.   if mode = lbWindows then
  134.   begin
  135.     s := StringReplace(s, #13#10, #10, [rfReplaceAll]);
  136.     s := StringReplace(s, #13,    #10, [rfReplaceAll]);
  137.     s := StringReplace(s, #10, #13#10, [rfReplaceAll]);
  138.   end
  139.   else if mode = lbLinux then
  140.   begin
  141.     s := StringReplace(s, #13#10, #13, [rfReplaceAll]);
  142.     s := StringReplace(s, #10,    #13, [rfReplaceAll]);
  143.   end
  144.   else if mode = lbMac then
  145.   begin
  146.     s := StringReplace(s, #13#10, #10, [rfReplaceAll]);
  147.     s := StringReplace(s, #13,    #10, [rfReplaceAll]);
  148.   end;
  149.   result := s;
  150. end;
  151.  
  152. // http://www.viathinksoft.de/?page=codelib&showid=70
  153. function ExtractFileNameWithoutExt(const fil: string): string;
  154. begin
  155.   result := Copy(ExtractFileName(fil), 1, Length(ExtractFileName(fil))-Length(ExtractFileExt(fil)));
  156. end;
  157.  
  158. function SearchNextFreeName(s: string; wantDir: boolean): string;
  159. var
  160.   i: integer;
  161. begin
  162.   if not FileExists(s) and not DirectoryExists(s) then
  163.   begin
  164.     result := s;
  165.     if wantDir then result := IncludeTrailingPathDelimiter(result);
  166.     Exit;
  167.   end;
  168.  
  169.   i := 2;
  170.  
  171.   if wantDir then
  172.   begin
  173.     s := ExcludeTrailingPathDelimiter(s);
  174.     repeat
  175.       result := Format('%s (%d)', [s, i]);
  176.       inc(i);
  177.     until not DirectoryExists(result) and not FileExists(result);
  178.     result := IncludeTrailingPathDelimiter(result);
  179.   end
  180.   else
  181.   begin
  182.     repeat
  183.       result := Format('%s (%d)%s', [ExtractFilePath(s)+ExtractFileNameWithoutExt(s), i, ExtractFileExt(s)]);
  184.       inc(i);
  185.     until not DirectoryExists(result) and not FileExists(result);
  186.   end;
  187. end;
  188.  
  189. // GetSpecialFolderPath
  190. // Ref: http://www.wer-weiss-was.de/theme159/article1058561.html
  191. function GetSpecialFolderPath(const Folder: integer): string;
  192. var
  193.   PIDL: PItemIDList;
  194.   Path: array[0..MAX_PATH] of char;
  195.   Malloc: IMalloc;
  196. begin
  197.   Path := '';
  198.   if Succeeded((SHGetSpecialFolderLocation(0, Folder, PIDL))) then
  199.     if (SHGetPathFromIDList(PIDL, Path)) then
  200.       if Succeeded(ShGetMalloc(Malloc)) then
  201.       begin
  202.         Malloc.Free(PIDL);
  203.         Malloc := nil;
  204.       end;
  205.   Result := Path;
  206. end;
  207.  
  208. function IsExtractable(AFilename: string): boolean;
  209. var
  210.   q: integer;
  211.   uz: TZipMaster19;
  212. begin
  213.   // TODO: Ist die Funktion gut? Fraglich, ob EOC64 ein Teil von EOC ist.
  214.   uz := TZipMaster19.Create(nil);
  215.   try
  216.     q := uz.QueryZip(AFilename);
  217.     result := true;
  218.     if (q and zqbHasLocal) <> zqbHasLocal then result := false;
  219.     if (q and zqbHasCentral) <> zqbHasCentral then result := false;
  220.     if ((q and zqbHasEOC) <> zqbHasEOC) and
  221.        ((q and zqbHasEOC64) <> zqbHasEOC64) then result := false;
  222.   finally
  223.     uz.Free;
  224.   end;
  225. end;
  226.  
  227. // Ref: http://www.delphiarea.com/articles/how-to-find-if-a-directory-is-writable/
  228. function IsDirectoryWritable(const Dir: String): Boolean;
  229. var
  230.   TempFile: array[0..MAX_PATH] of Char;
  231. begin
  232.   if GetTempFileName(PChar(Dir), 'DA', 0, TempFile) <> 0 then
  233.     Result := Windows.DeleteFile(TempFile)
  234.   else
  235.     Result := False;
  236. end;
  237.  
  238. function IsAtFlobbyDisk(AFileOrDir: string): boolean;
  239. var
  240.   s: string;
  241. begin
  242.   s := ExtractFileDrive(AFileOrDir);
  243.   s := UpperCase(s);
  244.  
  245.   result := (s = 'A:') or (s = 'B:');
  246. end;
  247.  
  248. end.
  249.