File: CastleFindFiles.html

package info (click to toggle)
castle-game-engine 5.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 185,428 kB
  • sloc: pascal: 260,781; cpp: 1,363; objc: 713; makefile: 537; xml: 496; sh: 480; php: 4
file content (243 lines) | stat: -rw-r--r-- 15,309 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Castle Game Engine: CastleFindFiles</title>
<meta name="generator" content="PasDoc 0.13.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>Castle Game Engine</h2><p><a href="introduction.html" class="navigation">Introduction</a></p><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h1 class="unit">Unit CastleFindFiles</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td><a class="section" href="#PasDoc-Classes">Classes, Interfaces, Objects and Records</a></td><td><a class="section" href="#PasDoc-FuncsProcs">Functions and Procedures</a></td><td><a class="section" href="#PasDoc-Types">Types</a></td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
<p>
Finding files matching some mask.</p>
<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li>SysUtils</li><li><a  href="CastleUtils.html">CastleUtils</a></li><li>Classes</li><li><a  href="CastleGenericLists.html">CastleGenericLists</a></li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Classes"></a><h3 class="cio">Classes, Interfaces, Objects and Records</h3>
<table class="classestable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname">record&nbsp;<a class="bold" href="CastleFindFiles.TFileInfo.html"><code>TFileInfo</code></a></td>
<td class="itemdesc">&nbsp;</td>
</tr>
</table>
<a name="PasDoc-FuncsProcs"></a><h3 class="summary">Functions and Procedures</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleFindFiles.html#FindFiles">FindFiles</a></b>(const Path, Mask: string; const FindDirectories: boolean; FileMethod: <a  href="CastleFindFiles.html#TFoundFileMethod">TFoundFileMethod</a>; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a  href="CastleFindFiles.html#FindFiles">FindFiles</a></b>(const Path, Mask: string; const FindDirectories: boolean; FileProc: <a  href="CastleFindFiles.html#TFoundFileProc">TFoundFileProc</a>; FileProcData: Pointer; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleFindFiles.html#FindFiles">FindFiles</a></b>(const PathAndMask: string; const FindDirectories: boolean; FileMethod: <a  href="CastleFindFiles.html#TFoundFileMethod">TFoundFileMethod</a>; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a  href="CastleFindFiles.html#FindFiles">FindFiles</a></b>(const PathAndMask: string; const FindDirectories: boolean; FileProc: <a  href="CastleFindFiles.html#TFoundFileProc">TFoundFileProc</a>; FileProcData: Pointer; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleFindFiles.html#SearchFileHard">SearchFileHard</a></b>(Path: string; const Base: string; out NewBase: string): boolean;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>function <b><a  href="CastleFindFiles.html#FindFirstFile">FindFirstFile</a></b>(const Mask: string; out FileInfo: <a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>): boolean;</code></td>
</tr>
</table>
<a name="PasDoc-Types"></a><h3 class="summary">Types</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a  href="CastleFindFiles.html#TFileInfoList">TFileInfoList</a></b> = specialize <a  href="CastleGenericLists.TGenericStructList.html">TGenericStructList</a>&lt;<a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>&gt;;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a  href="CastleFindFiles.html#TFoundFileProc">TFoundFileProc</a></b> = procedure (const FileInfo: <a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>; Data: Pointer);</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code><b><a  href="CastleFindFiles.html#TFoundFileMethod">TFoundFileMethod</a></b> = procedure (const FileInfo: <a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>) of object;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a  href="CastleFindFiles.html#TFindFilesOption">TFindFilesOption</a></b> = (...);</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code><b><a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a></b> = set of <a  href="CastleFindFiles.html#TFindFilesOption">TFindFilesOption</a>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Functions and Procedures</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="FindFiles"></a><code>function <b>FindFiles</b>(const Path, Mask: string; const FindDirectories: boolean; FileMethod: <a  href="CastleFindFiles.html#TFoundFileMethod">TFoundFileMethod</a>; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr><td colspan="1">
<p>
Find all files matching the given mask, and call FileProc for them.

<p>

<p>

<p>

<p>

<p>

<p>

<p>

<p></p>
<h6 class="description_section">Parameters</h6>
<dl class="parameters">
<dt>Path</dt>
<dd>Path URL to search inside. May be absolute or relative. Like everywhere in our engine, it can also be a local filesystem path, although we advice using URLs for everything. May, but doesn't have to, end with slash or PathDelim.</dd>
<dt>Mask</dt>
<dd>Mask of the files to search, may contain wildcards * and ?.</dd>
<dt>PathAndMask</dt>
<dd>Overloaded versions without separate Path and Mask parameters just assume that PathAndMask contain concatenated Path + Mask, separated by any valid path delimiter.</dd>
<dt>FindDirectories</dt>
<dd>Should directories also be found (reported by FileProc). Note that this is completely independent from whether we work recursively (ffRecursive in Options).</dd>
<dt>FileProc</dt>
<dd>Called on each file found. May be <code>Nil</code> (useful if you are only interested in the number of files found, returned by this function).</dd>
<dt>Options</dt>
<dd>A set of options. See <a class="normal" href="CastleFindFiles.html#TFindFilesOption">TFindFilesOption</a> for meaning of each option.</dd>
</dl>
<h6 class="description_section">Returns</h6>
<p class="return">How many times FileProc was called, that is: how many files/directories were matching. Useful to report to user how many files were processed, in particular to warn if nothing was processed.</p></td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="FindFiles"></a><code>function <b>FindFiles</b>(const Path, Mask: string; const FindDirectories: boolean; FileProc: <a  href="CastleFindFiles.html#TFoundFileProc">TFoundFileProc</a>; FileProcData: Pointer; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="FindFiles"></a><code>function <b>FindFiles</b>(const PathAndMask: string; const FindDirectories: boolean; FileMethod: <a  href="CastleFindFiles.html#TFoundFileMethod">TFoundFileMethod</a>; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="FindFiles"></a><code>function <b>FindFiles</b>(const PathAndMask: string; const FindDirectories: boolean; FileProc: <a  href="CastleFindFiles.html#TFoundFileProc">TFoundFileProc</a>; FileProcData: Pointer; Options: <a  href="CastleFindFiles.html#TFindFilesOptions">TFindFilesOptions</a>): Cardinal; overload;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="SearchFileHard"></a><code>function <b>SearchFileHard</b>(Path: string; const Base: string; out NewBase: string): boolean;</code></td>
</tr>
<tr><td colspan="1">
<p>
Search for a file, ignoring the case. Path must be absolute URL and contain the final slash. Returns URL relative to Path.

<p>We prefer to return just Base, if it exists, or when no alternative exists. When Base doesn't exist but some likely alternative exists (e.g. with different case), we return it.

<p>Looks for normal files/symlinks, that can be opened as usual files. Not directories.

<p>Returns if some file was found. Note that even when we return <code>False</code>, we still set NewBase (to original Base).</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="FindFirstFile"></a><code>function <b>FindFirstFile</b>(const Mask: string; out FileInfo: <a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>): boolean;</code></td>
</tr>
<tr><td colspan="1">
<p>
Find first file matching given Mask. The file can be anything (including a symlink or directory). It is not searched recursively, it is only searched for in the directory inside Mask.

<p>If found, returns <code>True</code> and sets FileInfo. Otherwise, returns <code>False</code> and leaves FileInfo undefined.</p>
</td></tr>
</table>
<h3 class="detail">Types</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TFileInfoList"></a><code><b>TFileInfoList</b> = specialize <a  href="CastleGenericLists.TGenericStructList.html">TGenericStructList</a>&lt;<a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>&gt;;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TFoundFileProc"></a><code><b>TFoundFileProc</b> = procedure (const FileInfo: <a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>; Data: Pointer);</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TFoundFileMethod"></a><code><b>TFoundFileMethod</b> = procedure (const FileInfo: <a  href="CastleFindFiles.TFileInfo.html">TFileInfo</a>) of object;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TFindFilesOption"></a><code><b>TFindFilesOption</b> = (...);</code></td>
</tr>
<tr><td colspan="1">
&nbsp;<h6 class="description_section">Values</h6>
<ul>
<li>
ffRecursive: If ffRecursive is in Options then <a class="normal" href="CastleFindFiles.html#FindFiles">FindFiles</a> (and friends) descend into subdirectories.

<p>Note that we always descend into <i>every</i> subdirectory (not only into those matching Mask, that would be pretty useless (and is a problem with Unix shell expansion)).

<p>Note that including ffRecursive in Options is something completely different than the FindDirectories parameter: FindDirectories says whether to report directories to FileProc; ffRecursive says whether to descend into directories and enumerate their files too.

<p>Recursive does <i>not</i> descend into symlinks to directories on Unix right now. The reason is that this would risk an infinite loop (unless some time-consuming precautions would be taken, or a level limit). In other words, it's just not implemented. But it <i>may</i> be implemented someday, as this would be definitely something useful.

<p>For Android asset searching: note that recursive searching if unfortunately not supported. Although Android NDK contains functions to iterate over a files inside a directory, it stupidly omits the subdirectories (only returns the non-directory files).</li>
<li>
ffDirContentsLast: Determines the order of reporting directory contents. Meaningfull only if ffRecursive is also included in Options.

<p>If not included, then directory contents (files and directories matching mask) are reported to the callback first. And only then we enter the subdirectories.

<p>If ffDirContentsLast is included, then we first enter subdirectories. Only then we list directory contents to the callback.</li>
<li>
ffReadAllFirst: If ffReadAllFirst is included in the Options then before calling FileProc, we will first read <i>all</i> file information to an internal array. And only then we will call FileProc for each item of this array.

<p>Why this may be useful? This way changes to the directory (like renaming / deleting / creating files) will not have any effect on the list of files we will get. This is important if our FileProc may modify the directory contents. Without ffReadAllFirst, it's undefined (OS-dependent and sometimes just random) if the new file names will appear in the directory list.</li>
</ul>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TFindFilesOptions"></a><code><b>TFindFilesOptions</b> = set of <a  href="CastleFindFiles.html#TFindFilesOption">TFindFilesOption</a>;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  _paq.push(["trackPageView"]);
  _paq.push(["enableLinkTracking"]);

  (function() {
    var u=(("https:" == document.location.protocol) ? "https" : "http") + "://michalis.ii.uni.wroc.pl/piwik-castle-engine/";
    _paq.push(["setTrackerUrl", u+"piwik.php"]);
    _paq.push(["setSiteId", "1"]);
    var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
    g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
  })();
</script>
<!-- End Piwik Code -->

<noscript>
<!-- Piwik Image Tracker -->
<img src="http://michalis.ii.uni.wroc.pl/piwik-castle-engine/piwik.php?idsite=1&amp;rec=1" style="border:0" alt="" />
<!-- End Piwik -->
</noscript>
<hr noshade size="1"><span class="appinfo"><em>Generated by <a  href="http://pasdoc.sourceforge.net/">PasDoc 0.13.0</a> on 2015-06-15 04:43:09</em>
</span>
</td></tr></table></body></html>