filutil.inc 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2012 by the Free Pascal development team
  4. File utility calls
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$ifndef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  12. Function FileOpen (Const FileName : unicodestring; Mode : Integer) : THandle;
  13. begin
  14. Result:=FileOpen(ToSingleByteFileSystemEncodedFileName(FileName),Mode);
  15. end;
  16. Function FileCreate (Const FileName : UnicodeString) : THandle;
  17. begin
  18. Result:=FileCreate(ToSingleByteFileSystemEncodedFileName(FileName));
  19. end;
  20. Function FileCreate (Const FileName : UnicodeString; Rights : Integer) : THandle;
  21. begin
  22. Result:=FileCreate(ToSingleByteFileSystemEncodedFileName(FileName),Rights);
  23. end;
  24. Function FileCreate (Const FileName : UnicodeString; ShareMode : Integer; Rights : Integer) : THandle;
  25. begin
  26. Result:=FileCreate(ToSingleByteFileSystemEncodedFileName(FileName),ShareMode,Rights);
  27. end;
  28. Function FileAge (Const FileName : UnicodeString): Int64;
  29. begin
  30. Result:=FileAge(ToSingleByteFileSystemEncodedFileName(FileName));
  31. end;
  32. Function FileExists (Const FileName : UnicodeString; FollowLink : Boolean) : Boolean;
  33. begin
  34. Result:=FileExists(ToSingleByteFileSystemEncodedFileName(FileName), FollowLink);
  35. end;
  36. Function DirectoryExists (Const Directory : UnicodeString; FollowLink : Boolean) : Boolean;
  37. begin
  38. Result:=DirectoryExists(ToSingleByteFileSystemEncodedFileName(Directory), FollowLink);
  39. end;
  40. Function FileGetAttr (Const FileName : UnicodeString) : Longint;
  41. begin
  42. Result:=FileGetAttr(ToSingleByteFileSystemEncodedFileName(FileName));
  43. end;
  44. Function FileSetAttr (Const Filename : UnicodeString; Attr: longint) : Longint;
  45. begin
  46. Result:=FileSetAttr(ToSingleByteFileSystemEncodedFileName(FileName),Attr);
  47. end;
  48. Function DeleteFile (Const FileName : UnicodeString) : Boolean;
  49. begin
  50. Result:=DeleteFile(ToSingleByteFileSystemEncodedFileName(FileName));
  51. end;
  52. Function RenameFile (Const OldName, NewName : UnicodeString) : Boolean;
  53. begin
  54. Result:=RenameFile(ToSingleByteFileSystemEncodedFileName(OldName),
  55. ToSingleByteFileSystemEncodedFileName(NewName));
  56. end;
  57. {$ifdef OS_FILEISREADONLY}
  58. Function FileIsReadOnly(const FileName: UnicodeString): Boolean;
  59. begin
  60. Result:=FileIsReadOnly(ToSingleByteFileSystemEncodedFileName(FileName));
  61. end;
  62. {$endif}
  63. {$ifdef OS_FILESETDATEBYNAME}
  64. Function FileSetDate (Const FileName : UnicodeString;Age : Int64) : Longint;
  65. begin
  66. Result:=FileSetDate(ToSingleByteFileSystemEncodedFileName(FileName),Age);
  67. end;
  68. {$endif}
  69. function FileAge(const FileName: RawByteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  70. Var
  71. Info : TRawByteSearchRec;
  72. A : Integer;
  73. begin
  74. for A:=1 to Length(FileName) do
  75. if CharInSet(FileName[A],['?','*']) then
  76. Exit(False);
  77. A:=0;
  78. if not FollowLink then
  79. A:=A or faSymLink;
  80. Result:=FindFirst(FileName,A,Info)=0;
  81. if Result then
  82. begin
  83. FileDateTime:=FileDatetoDateTime(Info.Time);
  84. FindClose(Info);
  85. end;
  86. end;
  87. function FileAgeUTC(const FileName: RawByteString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
  88. Var
  89. Info : TRawByteSearchRec;
  90. A : Integer;
  91. begin
  92. for A:=1 to Length(FileName) do
  93. if CharInSet(FileName[A],['?','*']) then
  94. Exit(False);
  95. A:=0;
  96. if not FollowLink then
  97. A:=A or faSymLink;
  98. Result:=FindFirst(FileName,A,Info)=0;
  99. if Result then
  100. begin
  101. FileDateTimeUTC:=FileDateToUniversal(Info.Time);
  102. FindClose(Info);
  103. end;
  104. end;
  105. Function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  106. begin
  107. Result:=FileAge(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTime,FollowLink);
  108. end;
  109. Function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
  110. begin
  111. Result:=FileAgeUTC(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTimeUTC,FollowLink);
  112. end;
  113. function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
  114. var
  115. sr: TRawbyteSymLinkRec;
  116. begin
  117. Result := FileGetSymLinkTarget(ToSingleByteFileSystemEncodedFileName(FileName), sr);
  118. if Result then
  119. begin
  120. SymLinkRec.TargetName := UnicodeString(sr.TargetName);
  121. SymLinkRec.Size := sr.Size;
  122. SymLinkRec.Attr := sr.Attr;
  123. {$ifdef SYMLINKREC_USEFINDDATA}
  124. SymLinkRec.FindData := sr.FindData;
  125. {$endif}
  126. {$ifdef unix}
  127. SymLinkRec.Mode := sr.Mode;
  128. {$endif}
  129. end;
  130. end;
  131. Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
  132. begin
  133. Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
  134. ToSingleByteFileSystemEncodedFileName(Dirlist),Options));
  135. end;
  136. Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
  137. begin
  138. Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
  139. ToSingleByteFileSystemEncodedFileName(DirList),ImplicitCurrentDir));
  140. end;
  141. Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
  142. begin
  143. Result:=UnicodeString(ExeSearch(ToSingleByteFileSystemEncodedFileName(Name),
  144. ToSingleByteFileSystemEncodedFileName(Dirlist)));
  145. end;
  146. Function FileSearch (Const Name, DirList : RawByteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
  147. Var
  148. I : longint;
  149. Temp : RawByteString;
  150. begin
  151. Result:=Name;
  152. temp:=SetDirSeparators(DirList);
  153. // Start with checking the file in the current directory
  154. If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
  155. exit;
  156. while True do begin
  157. If Temp = '' then
  158. Break; // No more directories to search - fail
  159. I:=pos(PathSeparator,Temp);
  160. If I<>0 then
  161. begin
  162. Result:=Copy (Temp,1,i-1);
  163. system.Delete(Temp,1,I);
  164. end
  165. else
  166. begin
  167. Result:=Temp;
  168. Temp:='';
  169. end;
  170. If Result<>'' then
  171. begin
  172. If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
  173. Result:=Copy(Result,2,Length(Result)-2);
  174. if (Result<>'') then
  175. Result:=IncludeTrailingPathDelimiter(Result)+name;
  176. end;
  177. If (Result <> '') and FileExists(Result) Then
  178. exit;
  179. end;
  180. Result:='';
  181. end;
  182. Function FileSearch (Const Name, DirList : RawByteString; ImplicitCurrentDir : Boolean) : RawByteString;
  183. begin
  184. if ImplicitCurrentDir then
  185. Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
  186. else
  187. Result:=FileSearch(Name,DirList,[]);
  188. end;
  189. Function ExeSearch (Const Name : RawByteString; Const DirList : RawByteString ='' ) : RawByteString;
  190. Var
  191. D : RawByteString;
  192. O : TFileSearchOptions;
  193. begin
  194. D:=DirList;
  195. if (D='') then
  196. D:=GetEnvironmentVariable('PATH');
  197. {$ifdef unix}
  198. O:=[];
  199. {$else unix}
  200. O:=[sfoImplicitCurrentDir,sfoStripQuotes];
  201. {$endif unix}
  202. Result := FileSearch(Name, D, O);
  203. end;
  204. {$endif}
  205. {$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  206. Function FileOpen (Const FileName : rawbytestring; Mode : Integer) : THandle;
  207. begin
  208. Result:=FileOpen(UnicodeString(FileName),Mode);
  209. end;
  210. Function FileCreate (Const FileName : RawByteString) : THandle;
  211. begin
  212. Result:=FileCreate(UnicodeString(FileName));
  213. end;
  214. Function FileCreate (Const FileName : RawByteString; Rights : Integer) : THandle;
  215. begin
  216. Result:=FileCreate(UnicodeString(FileName),Rights);
  217. end;
  218. Function FileCreate (Const FileName : RawByteString; ShareMode : Integer; Rights : Integer) : THandle;
  219. begin
  220. Result:=FileCreate(UnicodeString(FileName),ShareMode,Rights);
  221. end;
  222. Function FileAge (Const FileName : RawByteString): Int64;
  223. begin
  224. Result:=FileAge(UnicodeString(FileName));
  225. end;
  226. Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
  227. begin
  228. Result:=FileExists(UnicodeString(FileName), FollowLink);
  229. end;
  230. Function DirectoryExists (Const Directory : RawByteString; FollowLink : Boolean) : Boolean;
  231. begin
  232. Result:=DirectoryExists(UnicodeString(Directory), FollowLink);
  233. end;
  234. Function FileGetAttr (Const FileName : RawByteString) : Longint;
  235. begin
  236. Result:=FileGetAttr(unicodestring(FileName));
  237. end;
  238. Function FileSetAttr (Const Filename : RawByteString; Attr: longint) : Longint;
  239. begin
  240. Result:=FileSetAttr(unicodestring(FileName),Attr);
  241. end;
  242. Function DeleteFile (Const FileName : RawByteString) : Boolean;
  243. begin
  244. Result:=DeleteFile(UnicodeString(FileName));
  245. end;
  246. Function RenameFile (Const OldName, NewName : RawByteString) : Boolean;
  247. begin
  248. Result:=RenameFile(UnicodeString(OldName),UnicodeString(NewName));
  249. end;
  250. {$ifdef OS_FILEISREADONLY}
  251. Function FileIsReadOnly(const FileName: RawByteString): Boolean;
  252. begin
  253. Result:=FileIsReadOnly(UnicodeString(FileName));
  254. end;
  255. {$endif}
  256. {$ifdef OS_FILESETDATEBYNAME}
  257. Function FileSetDate (Const FileName : RawByteString;Age : Int64) : Longint;
  258. begin
  259. Result:=FileSetDate(UnicodeString(FileName),Age);
  260. end;
  261. {$endif}
  262. function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  263. Var
  264. Info : TUnicodeSearchRec;
  265. A : Integer;
  266. begin
  267. for A:=1 to Length(FileName) do
  268. if CharInSet(FileName[A],['?','*']) then
  269. Exit(False);
  270. A:=0;
  271. if not FollowLink then
  272. A:=A or faSymLink;
  273. Result:=FindFirst(FileName,A,Info)=0;
  274. if Result then
  275. begin
  276. FileDateTime:=Info.TimeStamp;
  277. FindClose(Info);
  278. end;
  279. end;
  280. function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
  281. Var
  282. Info : TUnicodeSearchRec;
  283. A : Integer;
  284. begin
  285. for A:=1 to Length(FileName) do
  286. if CharInSet(FileName[A],['?','*']) then
  287. Exit(False);
  288. A:=0;
  289. if not FollowLink then
  290. A:=A or faSymLink;
  291. Result:=FindFirst(FileName,A,Info)=0;
  292. if Result then
  293. begin
  294. FileDateTimeUTC:=Info.TimeStampUTC;
  295. FindClose(Info);
  296. end;
  297. end;
  298. Function FileAge(const FileName: RawbyteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  299. begin
  300. Result:=FileAge(UnicodeString(FileName),FileDateTime,FollowLink);
  301. end;
  302. function FileAgeUTC(const FileName: RawByteString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean;
  303. begin
  304. Result:=FileAgeUTC(UnicodeString(FileName),FileDateTimeUTC,FollowLink);
  305. end;
  306. function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
  307. var
  308. sr: TUnicodeSymLinkRec;
  309. begin
  310. Result := FileGetSymLinkTarget(UnicodeString(FileName), sr);
  311. if Result then
  312. begin
  313. SymLinkRec.TargetName := ToSingleByteFileSystemEncodedFileName(sr.TargetName);
  314. SymLinkRec.Size := sr.Size;
  315. SymLinkRec.Attr := sr.Attr;
  316. {$ifdef SYMLINKREC_USEFINDDATA}
  317. SymLinkRec.FindData := sr.FindData;
  318. {$endif}
  319. {$ifdef unix}
  320. SymLinkRec.Mode := sr.Mode;
  321. {$endif}
  322. end;
  323. end;
  324. Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
  325. Var
  326. I : longint;
  327. Temp : UnicodeString;
  328. begin
  329. Result:=Name;
  330. temp:=SetDirSeparators(DirList);
  331. // Start with checking the file in the current directory
  332. If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
  333. exit;
  334. while True do begin
  335. If Temp = '' then
  336. Break; // No more directories to search - fail
  337. I:=pos(PathSeparator,Temp);
  338. If I<>0 then
  339. begin
  340. Result:=Copy (Temp,1,i-1);
  341. system.Delete(Temp,1,I);
  342. end
  343. else
  344. begin
  345. Result:=Temp;
  346. Temp:='';
  347. end;
  348. If Result<>'' then
  349. begin
  350. If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
  351. Result:=Copy(Result,2,Length(Result)-2);
  352. if (Result<>'') then
  353. Result:=IncludeTrailingPathDelimiter(Result)+name;
  354. end;
  355. If (Result <> '') and FileExists(Result) Then
  356. exit;
  357. end;
  358. Result:='';
  359. end;
  360. Function FileSearch (Const Name, DirList : RawbyteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
  361. begin
  362. Result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),options));
  363. end;
  364. Function FileSearch (Const Name, DirList : RawbyteString; ImplicitCurrentDir : Boolean) : RawByteString;
  365. begin
  366. Result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),ImplicitCurrentDir));
  367. end;
  368. Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
  369. begin
  370. if ImplicitCurrentDir then
  371. Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
  372. else
  373. Result:=FileSearch(Name,DirList,[]);
  374. end;
  375. Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
  376. Var
  377. D : UnicodeString;
  378. O : TFileSearchOptions;
  379. begin
  380. D:=DirList;
  381. if (D='') then
  382. D:=UnicodeString(GetEnvironmentVariable('PATH'));
  383. {$ifdef unix}
  384. O:=[];
  385. {$else unix}
  386. O:=[sfoImplicitCurrentDir,sfoStripQuotes];
  387. {$endif unix}
  388. Result := FileSearch(Name, D, O);
  389. end;
  390. Function ExeSearch (Const Name : RawbyteString; Const DirList : RawbyteString ='' ) : RawByteString;
  391. begin
  392. Result:=ToSingleByteFileSystemEncodedFileName(ExeSearch(unicodestring(name),unicodestring(dirlist)));
  393. end;
  394. {$endif}
  395. function FileGetSymLinkTarget(const FileName: UnicodeString; out TargetName: UnicodeString): Boolean;
  396. var
  397. sr: TUnicodeSymLinkRec;
  398. begin
  399. Result := FileGetSymLinkTarget(FileName, sr);
  400. if Result then
  401. TargetName := sr.TargetName;
  402. end;
  403. function FileGetSymLinkTarget(const FileName: RawByteString; out TargetName: RawByteString): Boolean;
  404. var
  405. sr: TRawbyteSymLinkRec;
  406. begin
  407. Result := FileGetSymLinkTarget(FileName, sr);
  408. if Result then
  409. TargetName := sr.TargetName;
  410. end;
  411. Function GetFileHandle(var f : File):THandle;
  412. begin
  413. Result:=filerec(f).handle;
  414. end;
  415. Function GetFileHandle(var f : Text):THandle;
  416. begin
  417. Result:=textrec(f).handle;
  418. end;
  419. { FindFirst/FindNext. In order to avoid having to duplicate most code in th
  420. OS-specific implementations, we let those implementations fill in all
  421. fields of TRawbyte/UnicodeSearchRec, except for the name. That field is
  422. filled in by the OS-indepedent wrappers, which also takes care of setting
  423. the appropriate code page if applicable.
  424. }
  425. type
  426. TAbstractSearchRec = Record
  427. Time : Int64;
  428. Size : Int64;
  429. Attr : Longint;
  430. { this will be assigned by the generic code; it is actually either a
  431. rawbytestring or unicodestring; keep it a reference-counted type
  432. so that -gt doesn't overwrite it, the field name should be
  433. indication enough that you should not touch it }
  434. Name_do_not_touch : RawByteString;
  435. ExcludeAttr : Longint;
  436. FindHandle : {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif};
  437. {$ifdef unix}
  438. Mode : TMode;
  439. {$endif unix}
  440. {$ifdef SEARCHREC_USEFINDDATA}
  441. FindData : TFindData;
  442. {$endif}
  443. end;
  444. {$ifdef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  445. Function InternalFindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TAbstractSearchRec; var Name: RawByteString) : Longint; forward;
  446. Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : RawByteString) : Longint; forward;
  447. {$endif SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  448. {$ifdef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  449. Function InternalFindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TAbstractSearchRec; var Name: UnicodeString) : Longint; forward;
  450. Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : UnicodeString) : Longint; forward;
  451. {$endif SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  452. procedure InternalFindClose(var Handle: {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif}{$ifdef SEARCHREC_USEFINDDATA};var FindData: TFindData{$endif}); forward;
  453. {$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  454. Function FindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TRawByteSearchRec) : Longint;
  455. var
  456. Name: UnicodeString;
  457. begin
  458. Result:=InternalFindFirst(UnicodeString(Path),Attr,TAbstractSearchRec(Rslt),Name);
  459. if Result=0 then
  460. widestringmanager.Unicode2AnsiMoveProc(PUnicodeChar(Name),Rslt.Name,DefaultRTLFileSystemCodePage,length(Name));
  461. end;
  462. Function FindNext (Var Rslt : TRawByteSearchRec) : Longint;
  463. var
  464. Name: UnicodeString;
  465. begin
  466. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Name);
  467. if Result=0 then
  468. widestringmanager.Unicode2AnsiMoveProc(PUnicodeChar(Name),Rslt.Name,DefaultRTLFileSystemCodePage,length(Name));
  469. end;
  470. {$else not SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  471. Function FindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TRawByteSearchRec) : Longint;
  472. begin
  473. Result:=InternalFindFirst(Path,Attr,TAbstractSearchRec(Rslt),Rslt.Name);
  474. if Result=0 then
  475. SetCodePage(Rslt.Name,DefaultRTLFileSystemCodePage);
  476. end;
  477. Function FindNext (Var Rslt : TRawByteSearchRec) : Longint;
  478. begin
  479. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Rslt.Name);
  480. if Result=0 then
  481. SetCodePage(Rslt.Name,DefaultRTLFileSystemCodePage);
  482. end;
  483. {$endif not SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  484. {$ifndef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  485. Function FindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TUnicodeSearchRec) : Longint;
  486. var
  487. Name: RawByteString;
  488. begin
  489. Result:=InternalFindFirst(ToSingleByteFileSystemEncodedFileName(Path),Attr,TAbstractSearchRec(Rslt),Name);
  490. if Result=0 then
  491. Rslt.Name:=UnicodeString(Name);
  492. end;
  493. Function FindNext (Var Rslt : TUnicodeSearchRec) : Longint;
  494. var
  495. Name: RawByteString;
  496. begin
  497. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Name);
  498. if Result=0 then
  499. Rslt.Name:=UnicodeString(Name);
  500. end;
  501. {$else not SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  502. Function FindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TUnicodeSearchRec) : Longint;
  503. begin
  504. Result:=InternalFindFirst(Path,Attr,TAbstractSearchRec(Rslt),Rslt.Name);
  505. end;
  506. Function FindNext (Var Rslt : TUnicodeSearchRec) : Longint;
  507. begin
  508. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Rslt.Name);
  509. end;
  510. {$endif not SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  511. Procedure FindClose(Var f: TRawByteSearchRec);
  512. begin
  513. InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
  514. end;
  515. Procedure FindClose(Var f: TUnicodeSearchRec);
  516. begin
  517. InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
  518. end;
  519. {$if defined(windows) and not defined(win16)}
  520. function FindDataTimeToDateTime(constref aFileTime: FILETIME; out aResult: TDateTime): Boolean;
  521. var
  522. st, lt: TSystemTime;
  523. begin
  524. Result := FileTimeToSystemTime(aFileTime, st);
  525. if Result then begin
  526. {$ifndef wince}
  527. if SystemTimeToTzSpecificLocalTime(Nil, st, lt) then
  528. aResult := SystemTimeToDateTime(lt)
  529. else
  530. {$endif}
  531. aResult := SystemTimeToDateTime(st);
  532. end;
  533. end;
  534. function FindDataTimeToUTC(constref aFileTime: FILETIME; out aResult: TDateTime): Boolean;
  535. var
  536. st: TSystemTime;
  537. begin
  538. Result := FileTimeToSystemTime(aFileTime, st);
  539. if Result then
  540. aResult := SystemTimeToDateTime(st);
  541. end;
  542. {$endif}
  543. { TUnicodeSearchRec }
  544. function TUnicodeSearchRec.GetTimeStamp: TDateTime;
  545. begin
  546. {$if declared(FindDataTimeToDateTime)}
  547. if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
  548. {$endif}
  549. Result := FileDateToDateTime(Time);
  550. end;
  551. function TUnicodeSearchRec.GetTimeStampUTC: TDateTime;
  552. begin
  553. {$if declared(FindDataTimeToUTC)}
  554. if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then
  555. {$endif}
  556. Result := FileDateToUniversal(Time);
  557. end;
  558. { TRawbyteSearchRec }
  559. function TRawbyteSearchRec.GetTimeStamp: TDateTime;
  560. begin
  561. {$if declared(FindDataTimeToDateTime)}
  562. if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
  563. {$endif}
  564. Result := FileDateToDateTime(Time);
  565. end;
  566. function TRawbyteSearchRec.GetTimeStampUTC: TDateTime;
  567. begin
  568. {$if declared(FindDataTimeToDateTime)}
  569. if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then
  570. {$endif}
  571. Result := FileDateToUniversal(Time);
  572. end;
  573. { TUnicodeSymLinkRec }
  574. function TUnicodeSymLinkRec.GetTimeStamp: TDateTime;
  575. begin
  576. {$if declared(FindDataTimeToDateTime)}
  577. if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
  578. {$endif}
  579. Result := 0;
  580. end;
  581. { TRawbyteSymLinkRec }
  582. function TRawbyteSymLinkRec.GetTimeStamp: TDateTime;
  583. begin
  584. {$if declared(FindDataTimeToDateTime)}
  585. if not FindDataTimeToDateTime(FindData.ftLastWriteTime, Result) then
  586. {$endif}
  587. Result := 0;
  588. end;
  589. {$ifndef SYSUTILS_HAS_FILEFLUSH_IMPL}
  590. function FileFlush(Handle: THandle): Boolean;
  591. begin
  592. Result:= False;
  593. end;
  594. {$endif}
  595. Function GetFileContents(Const aFileName : RawByteString) : TBytes;
  596. Var
  597. H : Thandle;
  598. begin
  599. H:=FileOpen(aFileName,fmOpenRead or fmShareDenyWrite);
  600. if H<0 then
  601. Raise EFileNotFoundException.Create(SFileNotFound);
  602. try
  603. Result:=GetFileContents(H);
  604. finally
  605. FileClose(H);
  606. end;
  607. end;
  608. Function GetFileContents(Const aFileName : UnicodeString) : TBytes;
  609. Var
  610. H : Thandle;
  611. begin
  612. H:=FileOpen(aFileName,fmOpenRead or fmShareDenyWrite);
  613. if H<0 then
  614. Raise EFileNotFoundException.Create(SFileNotFound);
  615. try
  616. Result:=GetFileContents(H);
  617. finally
  618. FileClose(H);
  619. end;
  620. end;
  621. Function GetFileContents(Const aHandle : THandle) : TBytes;
  622. Var
  623. aLen,aOffset,aRead : Int64;
  624. aBuf : PByte;
  625. begin
  626. aLen:=FileSeek(aHandle,0,fsFromEnd);
  627. if aLen<0 then
  628. Raise EInOutError.Create(SSeekFailed);
  629. if FileSeek(aHandle,0,fsFromBeginning)<0 then
  630. Raise EInOutError.Create(SSeekFailed);
  631. SetLength(Result,aLen);
  632. aOffset:=0;
  633. Repeat
  634. aBuf:=@Result[aOffset];
  635. aRead:=FileRead(aHandle,aBuf^,aLen-aOffset);
  636. aOffset:=aOffset+aRead;
  637. Until (aOffset>=aLen) or (aRead<=0);
  638. if aRead<0 then
  639. RaiseLastOSError;
  640. end;
  641. Function GetFileAsString(Const aFileName : RawByteString; aEncoding : TEncoding) : RawByteString;
  642. begin
  643. Result:=aEncoding.GetAnsiString(GetFileContents(aFileName));
  644. end;
  645. Function GetFileAsString(Const aFileName : RawByteString) : RawByteString;
  646. begin
  647. Result:=GetFileAsString(aFileName,TEncoding.SystemEncoding);
  648. end;
  649. Function GetFileAsString(Const aFileName : UnicodeString) : UnicodeString;
  650. begin
  651. Result:=GetFileAsString(aFileName, TEncoding.Unicode);
  652. end;
  653. Function GetFileAsString(Const aFileName : UnicodeString; aEncoding : TEncoding) : UnicodeString;
  654. begin
  655. Result:=aEncoding.GetString(GetFileContents(aFileName))
  656. end;
  657. {$IFNDEF HAS_FILEDATETIME}
  658. Function FileGetDate (Handle : THandle; out FileDateTime: TDateTime) : Boolean;
  659. Var
  660. aDate : Int64;
  661. begin
  662. aDate:=FileGetDate(Handle);
  663. Result:=aDate>=0;
  664. if Result then
  665. FileDateTime:=FileDateToDateTime(aDate);
  666. end;
  667. Function FileGetDateUTC (Handle : THandle; out FileDateTimeUTC: TDateTime) : Boolean;
  668. Var
  669. aDate : Int64;
  670. begin
  671. aDate:=FileGetDate(Handle);
  672. Result:=aDate>=0;
  673. if Result then
  674. FileDateTimeUTC:=FileDateToUniversal(aDate);
  675. end;
  676. Function FileSetDate (Handle : THandle; const FileDateTime: TDateTime) : Longint;
  677. begin
  678. Result := FileSetDate(Handle,DateTimeToFileDate(FileDateTime));
  679. end;
  680. Function FileSetDateUTC (Handle : THandle; const FileDateTimeUTC: TDateTime) : Longint;
  681. begin
  682. Result := FileSetDate(Handle,UniversalToFileDate(FileDateTimeUTC));
  683. end;
  684. Function FileSetDate (Const FileName : UnicodeString;const FileDateTime : TDateTime) : Longint;
  685. begin
  686. Result:=FileSetDate(FileName,DateTimeToFileDate(FileDateTime));
  687. end;
  688. Function FileSetDateUTC (Const FileName : UnicodeString;const FileDateTimeUTC : TDateTime) : Longint;
  689. begin
  690. Result:=FileSetDate(FileName,UniversalToFileDate(FileDateTimeUTC));
  691. end;
  692. {$ENDIF}
  693. Function FileSetDate (Const FileName : RawByteString;const FileDateTime : TDateTime) : Longint;
  694. begin
  695. Result:=FileSetDate(UnicodeString(FileName),FileDateTime);
  696. end;
  697. Function FileSetDateUTC (Const FileName : RawByteString;const FileDateTimeUTC : TDateTime) : Longint;
  698. begin
  699. Result:=FileSetDateUTC(UnicodeString(FileName),FileDateTimeUTC);
  700. end;
  701. {$IFNDEF HAS_ISFILENAMECASESENSITIVE}
  702. Function IsFileNameCaseSensitive(Const aFileName : RawByteString) : Boolean;
  703. begin
  704. Result:=FileNameCaseSensitive;
  705. end;
  706. Function IsFileNameCaseSensitive(Const aFileName : UnicodeString) : Boolean;
  707. begin
  708. Result:=FileNameCaseSensitive;
  709. end;
  710. {$ENDIF HAS_ISFILENAMECASESENSITIVE}
  711. {$IFNDEF HAS_ISFILENAMECASEPRESERVING}
  712. Function IsFileNameCasePreserving(Const aFileName : RawByteString) : Boolean;
  713. begin
  714. Result:=FileNameCasePreserving;
  715. end;
  716. Function IsFileNameCasePreserving(Const aFileName : UnicodeString) : Boolean;
  717. begin
  718. Result:=FileNameCasePreserving;
  719. end;
  720. {$ENDIF HAS_ISFILENAMECASEPRESERVING}