filutil.inc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  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) : Boolean;
  33. begin
  34. Result:=FileExists(ToSingleByteFileSystemEncodedFileName(FileName));
  35. end;
  36. Function DirectoryExists (Const Directory : UnicodeString) : Boolean;
  37. begin
  38. Result:=DirectoryExists(ToSingleByteFileSystemEncodedFileName(Directory));
  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 : TSearchRec;
  72. A : Integer;
  73. begin
  74. for A:=1 to Length(FileName) do
  75. If (FileName[A] in ['?','*']) 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. FileDateTime:=FileDatetoDateTime (Info.Time);
  83. FindClose(Info);
  84. end;
  85. Function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  86. begin
  87. Result:=FileAge(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTime,FollowLink);
  88. end;
  89. Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
  90. begin
  91. Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
  92. ToSingleByteFileSystemEncodedFileName(Dirlist),Options));
  93. end;
  94. Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
  95. begin
  96. Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
  97. ToSingleByteFileSystemEncodedFileName(DirList),ImplicitCurrentDir));
  98. end;
  99. Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
  100. begin
  101. Result:=UnicodeString(ExeSearch(ToSingleByteFileSystemEncodedFileName(Name),
  102. ToSingleByteFileSystemEncodedFileName(Dirlist)));
  103. end;
  104. Function FileSearch (Const Name, DirList : RawByteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
  105. Var
  106. I : longint;
  107. Temp : RawByteString;
  108. begin
  109. Result:=Name;
  110. temp:=SetDirSeparators(DirList);
  111. // Start with checking the file in the current directory
  112. If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
  113. exit;
  114. while True do begin
  115. If Temp = '' then
  116. Break; // No more directories to search - fail
  117. I:=pos(PathSeparator,Temp);
  118. If I<>0 then
  119. begin
  120. Result:=Copy (Temp,1,i-1);
  121. system.Delete(Temp,1,I);
  122. end
  123. else
  124. begin
  125. Result:=Temp;
  126. Temp:='';
  127. end;
  128. If Result<>'' then
  129. begin
  130. If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
  131. Result:=Copy(Result,2,Length(Result)-2);
  132. if (Result<>'') then
  133. Result:=IncludeTrailingPathDelimiter(Result)+name;
  134. end;
  135. If (Result <> '') and FileExists(Result) Then
  136. exit;
  137. end;
  138. result:='';
  139. end;
  140. Function FileSearch (Const Name, DirList : RawByteString; ImplicitCurrentDir : Boolean) : RawByteString;
  141. begin
  142. if ImplicitCurrentDir then
  143. Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
  144. else
  145. Result:=FileSearch(Name,DirList,[]);
  146. end;
  147. Function ExeSearch (Const Name : RawByteString; Const DirList : RawByteString ='' ) : RawByteString;
  148. Var
  149. D : RawByteString;
  150. O : TFileSearchOptions;
  151. begin
  152. D:=DirList;
  153. if (D='') then
  154. D:=GetEnvironmentVariable('PATH');
  155. {$ifdef unix}
  156. O:=[];
  157. {$else unix}
  158. O:=[sfoImplicitCurrentDir,sfoStripQuotes];
  159. {$endif unix}
  160. Result := FileSearch(Name, D, O);
  161. end;
  162. {$endif}
  163. {$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
  164. Function FileOpen (Const FileName : rawbytestring; Mode : Integer) : THandle;
  165. begin
  166. Result:=FileOpen(UnicodeString(FileName),Mode);
  167. end;
  168. Function FileCreate (Const FileName : RawByteString) : THandle;
  169. begin
  170. Result:=FileCreate(UnicodeString(FileName));
  171. end;
  172. Function FileCreate (Const FileName : RawByteString; Rights : Integer) : THandle;
  173. begin
  174. Result:=FileCreate(UnicodeString(FileName),Rights);
  175. end;
  176. Function FileCreate (Const FileName : RawByteString; ShareMode : Integer; Rights : Integer) : THandle;
  177. begin
  178. Result:=FileCreate(UnicodeString(FileName),ShareMode,Rights);
  179. end;
  180. Function FileAge (Const FileName : RawByteString): Longint;
  181. begin
  182. Result:=FileAge(UnicodeString(FileName));
  183. end;
  184. Function FileExists (Const FileName : RawByteString) : Boolean;
  185. begin
  186. Result:=FileExists(UnicodeString(FileName));
  187. end;
  188. Function DirectoryExists (Const Directory : RawByteString) : Boolean;
  189. begin
  190. Result:=DirectoryExists(UnicodeString(Directory));
  191. end;
  192. Function FileGetAttr (Const FileName : RawByteString) : Longint;
  193. begin
  194. Result:=FileGetAttr(unicodestring(FileName));
  195. end;
  196. Function FileSetAttr (Const Filename : RawByteString; Attr: longint) : Longint;
  197. begin
  198. Result:=FileSetAttr(unicodestring(FileName),Attr);
  199. end;
  200. Function DeleteFile (Const FileName : RawByteString) : Boolean;
  201. begin
  202. Result:=DeleteFile(UnicodeString(FileName));
  203. end;
  204. Function RenameFile (Const OldName, NewName : RawByteString) : Boolean;
  205. begin
  206. Result:=RenameFile(UnicodeString(OldName),UnicodeString(NewName));
  207. end;
  208. {$ifdef OS_FILEISREADONLY}
  209. Function FileIsReadOnly(const FileName: RawByteString): Boolean;
  210. begin
  211. Result:=FileIsReadOnly(UnicodeString(FileName));
  212. end;
  213. {$endif}
  214. {$ifdef OS_FILESETDATEBYNAME}
  215. Function FileSetDate (Const FileName : RawByteString;Age : Longint) : Longint;
  216. begin
  217. Result:=FileSetDate(UnicodeString(FileName),Age);
  218. end;
  219. {$endif}
  220. function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  221. Var
  222. Info : TSearchRec;
  223. A : Integer;
  224. begin
  225. for A:=1 to Length(FileName) do
  226. If (FileName[A] in ['?','*']) then
  227. Exit(False);
  228. A:=0;
  229. if Not FollowLink then
  230. A:=A or faSymLink;
  231. Result:=FindFirst(FileName,A,Info)=0;
  232. If Result then
  233. FileDateTime:=FileDatetoDateTime (Info.Time);
  234. FindClose(Info);
  235. end;
  236. Function FileAge(const FileName: RawbyteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
  237. begin
  238. Result:=FileAge(UnicodeString(FileName),FileDateTime,FollowLink);
  239. end;
  240. Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
  241. Var
  242. I : longint;
  243. Temp : UnicodeString;
  244. begin
  245. Result:=Name;
  246. temp:=SetDirSeparators(DirList);
  247. // Start with checking the file in the current directory
  248. If (sfoImplicitCurrentDir in Options) and (Result <> '') and FileExists(Result) Then
  249. exit;
  250. while True do begin
  251. If Temp = '' then
  252. Break; // No more directories to search - fail
  253. I:=pos(PathSeparator,Temp);
  254. If I<>0 then
  255. begin
  256. Result:=Copy (Temp,1,i-1);
  257. system.Delete(Temp,1,I);
  258. end
  259. else
  260. begin
  261. Result:=Temp;
  262. Temp:='';
  263. end;
  264. If Result<>'' then
  265. begin
  266. If (sfoStripQuotes in Options) and (Result[1]='"') and (Result[Length(Result)]='"') then
  267. Result:=Copy(Result,2,Length(Result)-2);
  268. if (Result<>'') then
  269. Result:=IncludeTrailingPathDelimiter(Result)+name;
  270. end;
  271. If (Result <> '') and FileExists(Result) Then
  272. exit;
  273. end;
  274. result:='';
  275. end;
  276. Function FileSearch (Const Name, DirList : RawbyteString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : RawByteString;
  277. begin
  278. result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),options));
  279. end;
  280. Function FileSearch (Const Name, DirList : RawbyteString; ImplicitCurrentDir : Boolean) : RawByteString;
  281. begin
  282. result:=ToSingleByteFileSystemEncodedFileName(FileSearch(unicodestring(name),unicodestring(dirlist),ImplicitCurrentDir));
  283. end;
  284. Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : Boolean) : UnicodeString;
  285. begin
  286. if ImplicitCurrentDir then
  287. Result:=FileSearch(Name,DirList,[sfoImplicitCurrentDir])
  288. else
  289. Result:=FileSearch(Name,DirList,[]);
  290. end;
  291. Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString ='' ) : UnicodeString;
  292. Var
  293. D : UnicodeString;
  294. O : TFileSearchOptions;
  295. begin
  296. D:=DirList;
  297. if (D='') then
  298. D:=GetEnvironmentVariable('PATH');
  299. {$ifdef unix}
  300. O:=[];
  301. {$else unix}
  302. O:=[sfoImplicitCurrentDir,sfoStripQuotes];
  303. {$endif unix}
  304. Result := FileSearch(Name, D, O);
  305. end;
  306. Function ExeSearch (Const Name : RawbyteString; Const DirList : RawbyteString ='' ) : RawByteString;
  307. begin
  308. result:=ToSingleByteFileSystemEncodedFileName(ExeSearch(unicodestring(name),unicodestring(dirlist)));
  309. end;
  310. {$endif}