2
0

filutil.inc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  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): Longint;
  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 : Longint) : 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 FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  88. begin
  89. Result:=FileAge(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTime,FollowLink);
  90. end;
  91. function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
  92. var
  93. sr: TRawbyteSymLinkRec;
  94. begin
  95. Result := FileGetSymLinkTarget(ToSingleByteFileSystemEncodedFileName(FileName), sr);
  96. if Result then
  97. begin
  98. SymLinkRec.TargetName := UnicodeString(sr.TargetName);
  99. {$ifdef SYMLINKREC_USEFINDDATA}
  100. SymLinkRec.FindData := sr.FindData;
  101. {$endif}
  102. end;
  103. end;
  104. Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
  105. begin
  106. Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
  107. ToSingleByteFileSystemEncodedFileName(Dirlist),Options));
  108. end;
  109. Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
  110. begin
  111. Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
  112. ToSingleByteFileSystemEncodedFileName(DirList),ImplicitCurrentDir));
  113. end;
  114. Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
  115. begin
  116. Result:=UnicodeString(ExeSearch(ToSingleByteFileSystemEncodedFileName(Name),
  117. ToSingleByteFileSystemEncodedFileName(Dirlist)));
  118. end;
  119. Function FileSearch (Const Name, DirList : RawByteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
  120. Var
  121. I : longint;
  122. Temp : RawByteString;
  123. begin
  124. Result:=Name;
  125. temp:=SetDirSeparators(DirList);
  126. // Start with checking the file in the current directory
  127. If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
  128. exit;
  129. while True do begin
  130. If Temp = '' then
  131. Break; // No more directories to search - fail
  132. I:=pos(PathSeparator,Temp);
  133. If I<>0 then
  134. begin
  135. Result:=Copy (Temp,1,i-1);
  136. system.Delete(Temp,1,I);
  137. end
  138. else
  139. begin
  140. Result:=Temp;
  141. Temp:='';
  142. end;
  143. If Result<>'' then
  144. begin
  145. If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
  146. Result:=Copy(Result,2,Length(Result)-2);
  147. if (Result<>'') then
  148. Result:=IncludeTrailingPathDelimiter(Result)+name;
  149. end;
  150. If (Result <> '') and FileExists(Result) Then
  151. exit;
  152. end;
  153. Result:='';
  154. end;
  155. Function FileSearch (Const Name, DirList : RawByteString; ImplicitCurrentDir : Boolean) : RawByteString;
  156. begin
  157. if ImplicitCurrentDir then
  158. Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
  159. else
  160. Result:=FileSearch(Name,DirList,[]);
  161. end;
  162. Function ExeSearch (Const Name : RawByteString; Const DirList : RawByteString ='' ) : RawByteString;
  163. Var
  164. D : RawByteString;
  165. O : TFileSearchOptions;
  166. begin
  167. D:=DirList;
  168. if (D='') then
  169. D:=GetEnvironmentVariable('PATH');
  170. {$ifdef unix}
  171. O:=[];
  172. {$else unix}
  173. O:=[sfoImplicitCurrentDir,sfoStripQuotes];
  174. {$endif unix}
  175. Result := FileSearch(Name, D, O);
  176. end;
  177. {$endif}
  178. {$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  179. Function FileOpen (Const FileName : rawbytestring; Mode : Integer) : THandle;
  180. begin
  181. Result:=FileOpen(UnicodeString(FileName),Mode);
  182. end;
  183. Function FileCreate (Const FileName : RawByteString) : THandle;
  184. begin
  185. Result:=FileCreate(UnicodeString(FileName));
  186. end;
  187. Function FileCreate (Const FileName : RawByteString; Rights : Integer) : THandle;
  188. begin
  189. Result:=FileCreate(UnicodeString(FileName),Rights);
  190. end;
  191. Function FileCreate (Const FileName : RawByteString; ShareMode : Integer; Rights : Integer) : THandle;
  192. begin
  193. Result:=FileCreate(UnicodeString(FileName),ShareMode,Rights);
  194. end;
  195. Function FileAge (Const FileName : RawByteString): Longint;
  196. begin
  197. Result:=FileAge(UnicodeString(FileName));
  198. end;
  199. Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
  200. begin
  201. Result:=FileExists(UnicodeString(FileName), FollowLink);
  202. end;
  203. Function DirectoryExists (Const Directory : RawByteString; FollowLink : Boolean) : Boolean;
  204. begin
  205. Result:=DirectoryExists(UnicodeString(Directory), FollowLink);
  206. end;
  207. Function FileGetAttr (Const FileName : RawByteString) : Longint;
  208. begin
  209. Result:=FileGetAttr(unicodestring(FileName));
  210. end;
  211. Function FileSetAttr (Const Filename : RawByteString; Attr: longint) : Longint;
  212. begin
  213. Result:=FileSetAttr(unicodestring(FileName),Attr);
  214. end;
  215. Function DeleteFile (Const FileName : RawByteString) : Boolean;
  216. begin
  217. Result:=DeleteFile(UnicodeString(FileName));
  218. end;
  219. Function RenameFile (Const OldName, NewName : RawByteString) : Boolean;
  220. begin
  221. Result:=RenameFile(UnicodeString(OldName),UnicodeString(NewName));
  222. end;
  223. {$ifdef OS_FILEISREADONLY}
  224. Function FileIsReadOnly(const FileName: RawByteString): Boolean;
  225. begin
  226. Result:=FileIsReadOnly(UnicodeString(FileName));
  227. end;
  228. {$endif}
  229. {$ifdef OS_FILESETDATEBYNAME}
  230. Function FileSetDate (Const FileName : RawByteString;Age : Longint) : Longint;
  231. begin
  232. Result:=FileSetDate(UnicodeString(FileName),Age);
  233. end;
  234. {$endif}
  235. function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  236. Var
  237. Info : TUnicodeSearchRec;
  238. A : Integer;
  239. begin
  240. for A:=1 to Length(FileName) do
  241. if CharInSet(FileName[A],['?','*']) then
  242. Exit(False);
  243. A:=0;
  244. if not FollowLink then
  245. A:=A or faSymLink;
  246. Result:=FindFirst(FileName,A,Info)=0;
  247. if Result then
  248. begin
  249. FileDateTime:=FileDatetoDateTime(Info.Time);
  250. FindClose(Info);
  251. end;
  252. end;
  253. Function FileAge(const FileName: RawbyteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  254. begin
  255. Result:=FileAge(UnicodeString(FileName),FileDateTime,FollowLink);
  256. end;
  257. function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
  258. var
  259. sr: TUnicodeSymLinkRec;
  260. begin
  261. Result := FileGetSymLinkTarget(UnicodeString(FileName), sr);
  262. if Result then
  263. begin
  264. SymLinkRec.TargetName := ToSingleByteFileSystemEncodedFileName(sr.TargetName);
  265. {$ifdef SYMLINKREC_USEFINDDATA}
  266. SymLinkRec.FindData := sr.FindData;
  267. {$endif}
  268. end;
  269. end;
  270. Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
  271. Var
  272. I : longint;
  273. Temp : UnicodeString;
  274. begin
  275. Result:=Name;
  276. temp:=SetDirSeparators(DirList);
  277. // Start with checking the file in the current directory
  278. If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
  279. exit;
  280. while True do begin
  281. If Temp = '' then
  282. Break; // No more directories to search - fail
  283. I:=pos(PathSeparator,Temp);
  284. If I<>0 then
  285. begin
  286. Result:=Copy (Temp,1,i-1);
  287. system.Delete(Temp,1,I);
  288. end
  289. else
  290. begin
  291. Result:=Temp;
  292. Temp:='';
  293. end;
  294. If Result<>'' then
  295. begin
  296. If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
  297. Result:=Copy(Result,2,Length(Result)-2);
  298. if (Result<>'') then
  299. Result:=IncludeTrailingPathDelimiter(Result)+name;
  300. end;
  301. If (Result <> '') and FileExists(Result) Then
  302. exit;
  303. end;
  304. Result:='';
  305. end;
  306. Function FileSearch (Const Name, DirList : RawbyteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
  307. begin
  308. Result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),options));
  309. end;
  310. Function FileSearch (Const Name, DirList : RawbyteString; ImplicitCurrentDir : Boolean) : RawByteString;
  311. begin
  312. Result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),ImplicitCurrentDir));
  313. end;
  314. Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
  315. begin
  316. if ImplicitCurrentDir then
  317. Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
  318. else
  319. Result:=FileSearch(Name,DirList,[]);
  320. end;
  321. Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
  322. Var
  323. D : UnicodeString;
  324. O : TFileSearchOptions;
  325. begin
  326. D:=DirList;
  327. if (D='') then
  328. D:=UnicodeString(GetEnvironmentVariable('PATH'));
  329. {$ifdef unix}
  330. O:=[];
  331. {$else unix}
  332. O:=[sfoImplicitCurrentDir,sfoStripQuotes];
  333. {$endif unix}
  334. Result := FileSearch(Name, D, O);
  335. end;
  336. Function ExeSearch (Const Name : RawbyteString; Const DirList : RawbyteString ='' ) : RawByteString;
  337. begin
  338. Result:=ToSingleByteFileSystemEncodedFileName(ExeSearch(unicodestring(name),unicodestring(dirlist)));
  339. end;
  340. {$endif}
  341. function FileGetSymLinkTarget(const FileName: UnicodeString; out TargetName: UnicodeString): Boolean;
  342. var
  343. sr: TUnicodeSymLinkRec;
  344. begin
  345. Result := FileGetSymLinkTarget(FileName, sr);
  346. if Result then
  347. TargetName := sr.TargetName;
  348. end;
  349. function FileGetSymLinkTarget(const FileName: RawByteString; out TargetName: RawByteString): Boolean;
  350. var
  351. sr: TRawbyteSymLinkRec;
  352. begin
  353. Result := FileGetSymLinkTarget(FileName, sr);
  354. if Result then
  355. TargetName := sr.TargetName;
  356. end;
  357. Function GetFileHandle(var f : File):THandle;
  358. begin
  359. Result:=filerec(f).handle;
  360. end;
  361. Function GetFileHandle(var f : Text):THandle;
  362. begin
  363. Result:=textrec(f).handle;
  364. end;
  365. { FindFirst/FindNext. In order to avoid having to duplicate most code in th
  366. OS-specific implementations, we let those implementations fill in all
  367. fields of TRawbyte/UnicodeSearchRec, except for the name. That field is
  368. filled in by the OS-indepedent wrappers, which also takes care of setting
  369. the appropriate code page if applicable.
  370. }
  371. type
  372. TAbstractSearchRec = Record
  373. Time : Longint;
  374. Size : Int64;
  375. Attr : Longint;
  376. { this will be assigned by the generic code; it is actually either a
  377. rawbytestring or unicodestring; keep it a reference-counted type
  378. so that -gt doesn't overwrite it, the field name should be
  379. indication enough that you should not touch it }
  380. Name_do_not_touch : RawByteString;
  381. ExcludeAttr : Longint;
  382. FindHandle : {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif};
  383. {$ifdef unix}
  384. Mode : TMode;
  385. {$endif unix}
  386. {$ifdef SEARCHREC_USEFINDDATA}
  387. FindData : TFindData;
  388. {$endif}
  389. end;
  390. {$ifdef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  391. Function InternalFindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TAbstractSearchRec; var Name: RawByteString) : Longint; forward;
  392. Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : RawByteString) : Longint; forward;
  393. {$endif SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  394. {$ifdef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  395. Function InternalFindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TAbstractSearchRec; var Name: UnicodeString) : Longint; forward;
  396. Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : UnicodeString) : Longint; forward;
  397. {$endif SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  398. procedure InternalFindClose(var Handle: {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif}{$ifdef SEARCHREC_USEFINDDATA};var FindData: TFindData{$endif}); forward;
  399. {$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  400. Function FindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TRawByteSearchRec) : Longint;
  401. var
  402. Name: UnicodeString;
  403. begin
  404. Result:=InternalFindFirst(UnicodeString(Path),Attr,TAbstractSearchRec(Rslt),Name);
  405. if Result=0 then
  406. widestringmanager.Unicode2AnsiMoveProc(PUnicodeChar(Name),Rslt.Name,DefaultRTLFileSystemCodePage,length(Name));
  407. end;
  408. Function FindNext (Var Rslt : TRawByteSearchRec) : Longint;
  409. var
  410. Name: UnicodeString;
  411. begin
  412. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Name);
  413. if Result=0 then
  414. widestringmanager.Unicode2AnsiMoveProc(PUnicodeChar(Name),Rslt.Name,DefaultRTLFileSystemCodePage,length(Name));
  415. end;
  416. {$else not SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  417. Function FindFirst (Const Path : RawByteString; Attr : Longint; out Rslt : TRawByteSearchRec) : Longint;
  418. begin
  419. Result:=InternalFindFirst(Path,Attr,TAbstractSearchRec(Rslt),Rslt.Name);
  420. if Result=0 then
  421. SetCodePage(Rslt.Name,DefaultRTLFileSystemCodePage);
  422. end;
  423. Function FindNext (Var Rslt : TRawByteSearchRec) : Longint;
  424. begin
  425. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Rslt.Name);
  426. if Result=0 then
  427. SetCodePage(Rslt.Name,DefaultRTLFileSystemCodePage);
  428. end;
  429. {$endif not SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  430. {$ifndef SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  431. Function FindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TUnicodeSearchRec) : Longint;
  432. var
  433. Name: RawByteString;
  434. begin
  435. Result:=InternalFindFirst(ToSingleByteFileSystemEncodedFileName(Path),Attr,TAbstractSearchRec(Rslt),Name);
  436. if Result=0 then
  437. Rslt.Name:=UnicodeString(Name);
  438. end;
  439. Function FindNext (Var Rslt : TUnicodeSearchRec) : Longint;
  440. var
  441. Name: RawByteString;
  442. begin
  443. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Name);
  444. if Result=0 then
  445. Rslt.Name:=UnicodeString(Name);
  446. end;
  447. {$else not SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  448. Function FindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt : TUnicodeSearchRec) : Longint;
  449. begin
  450. Result:=InternalFindFirst(Path,Attr,TAbstractSearchRec(Rslt),Rslt.Name);
  451. end;
  452. Function FindNext (Var Rslt : TUnicodeSearchRec) : Longint;
  453. begin
  454. Result:=InternalFindNext(TAbstractSearchRec(Rslt),Rslt.Name);
  455. end;
  456. {$endif not SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
  457. Procedure FindClose(Var f: TRawByteSearchRec);
  458. begin
  459. InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
  460. end;
  461. Procedure FindClose(Var f: TUnicodeSearchRec);
  462. begin
  463. InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
  464. end;
  465. { TUnicodeSearchRec }
  466. function TUnicodeSearchRec.GetTimeStamp: TDateTime;
  467. begin
  468. Result := FileDateToDateTime(Time);
  469. end;
  470. { TRawbyteSearchRec }
  471. function TRawbyteSearchRec.GetTimeStamp: TDateTime;
  472. begin
  473. Result := FileDateToDateTime(Time);
  474. end;
  475. { TUnicodeSymLinkRec }
  476. function TUnicodeSymLinkRec.GetTimeStamp: TDateTime;
  477. {$if defined(win32) or defined(win64) or defined(wince)}
  478. var
  479. st: TSystemTime;
  480. {$endif}
  481. begin
  482. {$if defined(win32) or defined(win64) or defined(wince)}
  483. FileTimeToSystemTime(FindData.ftLastWriteTime, st);
  484. Result := SystemTimeToDateTime(st);
  485. {$else}
  486. Result := 0;
  487. {$endif}
  488. end;
  489. { TRawbyteSymLinkRec }
  490. function TRawbyteSymLinkRec.GetTimeStamp: TDateTime;
  491. {$if defined(win32) or defined(win64) or defined(wince)}
  492. var
  493. st: TSystemTime;
  494. {$endif}
  495. begin
  496. {$if defined(win32) or defined(win64) or defined(wince)}
  497. FileTimeToSystemTime(FindData.ftLastWriteTime, st);
  498. Result := SystemTimeToDateTime(st);
  499. {$else}
  500. Result := 0;
  501. {$endif}
  502. end;
  503. {$ifndef SYSUTILS_HAS_FILEFLUSH_IMPL}
  504. function FileFlush(Handle: THandle): Boolean;
  505. begin
  506. Result:= False;
  507. end;
  508. {$endif}