-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlisting4.html
executable file
·398 lines (332 loc) · 16.4 KB
/
listing4.html
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<!-- BEGIN META TAG INFO -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="home" href="http://developer.apple.com/">
<link rel="find" href="http://developer.apple.com/search/">
<link rel="stylesheet" type="text/css" href="../../documentation/css/adcstyle.css" title="fonts">
<script language="JavaScript" src="../../documentation/js/adc.js" type="text/javascript"></script>
<!-- END META TAG INFO -->
<!-- BEGIN TITLE -->
<title>FSCopyObject - /Sources/FSCopyObject.h</title>
<!-- END TITLE -->
<script language="JavaScript">
function JumpToNewPage() {
window.location=document.scpopupmenu.gotop.value;
return true;
}
</script>
</head>
<!-- BEGIN BODY OPEN -->
<body>
<!--END BODY OPEN -->
<!-- START CENTER OPEN -->
<center>
<!-- END CENTER OPEN -->
<!-- BEGIN LOGO AND SEARCH -->
<!--#include virtual="/includes/adcnavbar"-->
<!-- END LOGO AND SEARCH -->
<!-- START BREADCRUMB -->
<div id="breadcrumb">
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td scope="row"><img width="340" height="10" src="images/1dot.gif" alt=""></td>
<td><img width="340" height="10" src="images/1dot.gif" alt=""></td>
</tr>
<tr valign="middle">
<td align="left" colspan="2">
<a href="http://developer.apple.com/">ADC Home</a> > <a href="../../referencelibrary/index.html">Reference Library</a> > <a href="../../samplecode/index.html">Sample Code</a> > <a href="../../samplecode/Carbon/index.html">Carbon</a> > <a href="../../samplecode/Carbon/idxFileManagement-date.html">File Management</a> > <A HREF="javascript:location.replace('index.html');">FSCopyObject</A> >
</td>
</tr>
<tr>
<td colspan="2" scope="row"><img width="680" height="35" src="images/1dot.gif" alt=""></td>
</tr>
</table>
</div>
<!-- END BREADCRUMB -->
<!-- START MAIN CONTENT -->
<!-- START TITLE GRAPHIC AND INTRO-->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td><h1><div id="pagehead">FSCopyObject</div></h1></td>
</tr>
</table>
<!-- END TITLE GRAPHIC AND INTRO -->
<!-- START WIDE COLUMN -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td id="scdetails">
<h2>/Sources/FSCopyObject.h</h2>
<form name="scpopupmenu" onSubmit="return false;" method=post>
<p><strong>View Source Code:</strong>
<select name="gotop" onChange="JumpToNewPage();" style="width:340px"><option selected value="ingnore">Select File</option>
<option value="listing1.html">/ReadMe.txt</option>
<option value="listing2.html">/Sources/carb.r</option>
<option value="listing3.html">/Sources/FSCopyObject.c</option>
<option value="listing4.html">/Sources/FSCopyObject.h</option>
<option value="listing5.html">/Sources/GenLinkedList.c</option>
<option value="listing6.html">/Sources/GenLinkedList.h</option>
<option value="listing7.html">/Sources/HelloWorld.c</option>
<option value="listing8.html">/Sources/HelloWorldTool.c</option></select>
</p>
</form>
<p><strong><a href="FSCopyObject.zip">Download Sample</a></strong> (“FSCopyObject.zip”, 289.2K)<BR>
<strong><a href="FSCopyObject.dmg">Download Sample</a></strong> (“FSCopyObject.dmg”, 368.4K)</p>
<!--
<p><strong><a href="#">Download Sample</a></strong> (“filename.sit”, 500K)</p>
-->
</td>
</tr>
<tr>
<td scope="row"><img width="680" height="10" src="images/1dot.gif" alt=""><br>
<img height="1" width="680" src="images/1dot_919699.gif" alt=""><br>
<img width="680" height="20" src="images/1dot.gif" alt=""></td>
</tr>
<tr>
<td scope="row">
<!--googleon: index -->
<pre class="sourcecodebox">/*
File: FSCopyObject.h
Contains: A Copy/Delete Files/Folders engine which uses the HFS+ API's
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
("Apple") in consideration of your agreement to the following terms, and your
use, installation, modification or redistribution of this Apple software
constitutes acceptance of these terms. If you do not agree with these terms,
please do not use, install, modify or redistribute this Apple software.
In consideration of your agreement to abide by the following terms, and subject
to these terms, Apple grants you a personal, non-exclusive license, under Apple's
copyrights in this original Apple software (the "Apple Software"), to use,
reproduce, modify and redistribute the Apple Software, with or without
modifications, in source and/or binary forms; provided that if you redistribute
the Apple Software in its entirety and without modifications, you must retain
this notice and the following text and disclaimers in all such redistributions of
the Apple Software. Neither the name, trademarks, service marks or logos of
Apple Computer, Inc. may be used to endorse or promote products derived from the
Apple Software without specific prior written permission from Apple. Except as
expressly stated in this notice, no other rights or licenses, express or implied,
are granted by Apple herein, including but not limited to any patent rights that
may be infringed by your derivative works or by other works in which the Apple
Software may be incorporated.
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
COMBINATION WITH YOUR PRODUCTS.
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Copyright © 2002-2004 Apple Computer, Inc., All Rights Reserved
*/
#ifndef __FSCOPYOBJECT_H__
#define __FSCOPYOBJECT_H__
#ifdef __cplusplus
extern "C" {
#endif
#if TARGET_API_MAC_OSX || defined( __APPLE_CC__ )
#include <CoreServices/CoreServices.h>
#endif
#define DEBUG 1 /* set to zero if you don't want debug spew */
#if DEBUG
#include <stdio.h>
#define QuoteExceptionString(x) #x
#define dwarning(s) do { printf s; fflush(stderr); } while( 0 )
#define mycheck_noerr( error ) \
do { \
if( (OSErr) error != noErr ) { \
dwarning((QuoteExceptionString(error) " != noErr in File: %s, Function: %s, Line: %d, Error: %d\n", \
__FILE__, __FUNCTION__, __LINE__, (OSErr) error)); \
} \
} while( false )
#define mycheck( assertion ) \
do { \
if( ! assertion ) { \
dwarning((QuoteExceptionString(assertion) " failed in File: %s, Function: %s, Line: %d\n", \
__FILE__, __FUNCTION__, __LINE__)); \
} \
} while( false )
#define myverify(assertion) mycheck(assertion)
#define myverify_noerr(assertion) mycheck_noerr( (assertion) )
#else
#define dwarning(s)
#define mycheck(assertion)
#define mycheck_noerr(err)
#define myverify(assertion) do { (void) (assertion); } while (0)
#define myverify_noerr(assertion) myverify(assertion)
#endif
/*
This code takes some tricks/techniques from MoreFilesX (by Jim Luther) and
MPFileCopy (by Quinn), wraps them all up into an easy to use API, and adds a bunch of
features and bug fixes. It will run on Mac OS 9.1 through 9.2.x and 10.1.x
and up (Classic, Carbon and Mach-O)
*/
/* Different options that FSCopyObject can take during a copy */
typedef UInt32 DupeAction;
enum {
kDupeActionStandard, /* will do the copy with no frills */
kDupeActionReplace, /* will delete the existing object and then copy over the new one */
kDupeActionRename /* will rename the new object if an object of the same name exists */
};
/*****************************************************************************/
#pragma mark CopyObjectFilterProcPtr
/*
This is the prototype for the CallCopyObjectFilterProc function which
is called once for each file and directory found by FSCopyObject.
The CallCopyObjectFilterProc can use the read-only data it receives for
whatever it wants.
The result of the CallCopyObjectFilterProc function indicates if
the copy should be stopped. To stop the copy, return an error; to continue
the copy, return noErr.
The yourDataPtr parameter can point to whatever data structure you might
want to access from within the CallCopyObjectFilterProc.
Note: If an error had occured during the copy of the current object
(currentOSErr != noErr) the FSRef etc might not be valid
containerChanged --> Set to true if the container's contents changed
during iteration.
currentLevel --> The current recursion level into the container.
1 = the container, 2 = the container's immediate
subdirectories, etc.
currentOSErr --> The current error code, shows the results of the
copy of the current object (ref)
catalogInfo --> The catalog information for the current object.
Only the fields requested by the whichInfo
parameter passed to FSIterateContainer are valid.
ref --> The FSRef to the current object.
spec --> The FSSpec to the current object if the wantFSSpec
parameter passed to FSCopyObject is true.
name --> The name of the current object if the wantName
parameter passed to FSCopyObject is true.
yourDataPtr --> An optional pointer to whatever data structure you
might want to access from within the
CallCopyObjectFilterProc.
result <-- To continue the copy, return noErr
__________
Also see: FSCopyObject
*/
typedef CALLBACK_API( OSErr , CopyObjectFilterProcPtr ) (
Boolean containerChanged,
ItemCount currentLevel,
OSErr currentOSErr,
const FSCatalogInfo *catalogInfo,
const FSRef *ref,
const FSSpec *spec,
const HFSUniStr255 *name,
void *yourDataPtr);
/*****************************************************************************/
#pragma mark CallCopyObjectFilterProc
#define CallCopyObjectFilterProc(userRoutine, containerChanged, currentLevel, currentOSErr, catalogInfo, ref, spec, name, yourDataPtr) \
(*(userRoutine))((containerChanged), (currentLevel), (currentOSErr), (catalogInfo), (ref), (spec), (name), (yourDataPtr))
/*****************************************************************************/
#pragma mark FSCopyObject
/*
The FSCopyObject function takes a source object (can be a file or directory)
and copies it (and its contents if it's a directory) to the new destination
directory.
It will call your CopyObjectFilterProcPtr once for each object copied
The maxLevels parameter is only used when the object is a directory,
ignored otherwise.
It lets you control how deep the recursion goes.
If maxLevels is 1, FSCopyObject only scans the specified directory;
if maxLevels is 2, FSCopyObject scans the specified directory and
one subdirectory below the specified directory; etc. Set maxLevels to
zero to scan all levels.
The yourDataPtr parameter can point to whatever data structure you might
want to access from within your CopyObjectFilterProcPtr.
source --> The FSRef to the object you want to copy
destDir --> The FSRef to the directory you wish to copy source to
maxLevels --> Maximum number of directory levels to scan or
zero to scan all directory levels, ignored if the
object is a file
whichInfo --> The fields of the FSCatalogInfo you wish passed
to you in your CopyObjectFilterProc
dupeAction --> The action to take if an object of the same name exists
in the destination
newName --> The name you want the new object to have. If you pass
in NULL, the source object name will be used.
wantFSSpec --> Set to true if you want the FSSpec to each
object passed to your CopyObjectFilterProc.
wantName --> Set to true if you want the name of each
object passed to your CopyObjectFilterProc.
filterProcPtr --> A pointer to the CopyObjectFilterProc you
want called once for each object found
by FSCopyObject.
yourDataPtr --> An optional pointer to whatever data structure you
might want to access from within the
CopyObjectFilterProc.
newObjectRef --> An optional pointer to an FSRef that, on return,
references the new object. If you don't want this
info returned, pass in NULL
newObjectSpec --> An optional pointer to an FSSPec that, on return,
references the new object. If you don't want this
info returned, pass in NULL
*/
OSErr FSCopyObject( const FSRef *source,
const FSRef *destDir,
ItemCount maxLevels,
FSCatalogInfoBitmap whichInfo,
DupeAction dupeAction,
const HFSUniStr255 *newName, /* can be NULL */
Boolean wantFSSpec,
Boolean wantName,
CopyObjectFilterProcPtr filterProcPtr, /* can be NULL */
void *yourDataPtr, /* can be NULL */
FSRef *newObjectRef, /* can be NULL */
FSSpec *newObjectSpec); /* can be NULL */
/*****************************************************************************/
#pragma mark FSDeleteObjects
/*
The FSDeleteObjects function takes an FSRef to a file or directory
and attempts to delete it. If the object is a directory, all files
and subdirectories in the specified directory are deleted. If a
locked file or directory is encountered, it is unlocked and then
deleted. After deleting the directory's contents, the directory
is deleted. If any unexpected errors are encountered,
FSDeleteContainer quits and returns to the caller.
source --> FSRef to an object (can be file or directory).
__________
*/
OSErr FSDeleteObjects( const FSRef *source );
#ifdef __cplusplus
}
#endif
#endif</pre>
<!--googleoff: index -->
</td>
</tr>
</table>
<!-- END WIDE COLUMN -->
<!-- END MAIN CONTENT -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div style="width: 100%; height: 1px; background-color: #919699; margin-top: 5px; margin-bottom: 15px"></div></td>
</tr>
<tr>
<td align="center"><br/>
<table border="0" cellpadding="0" cellspacing="0" class="graybox">
<tr>
<th>Did this document help you?</th>
</tr>
<tr>
<td>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=1&url=/samplecode/FSCopyObject/listing4.html%3Fid%3DDTS10000472-1.0&media=dvd" target=_new>Yes</a>: Tell us what works for you.</div>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=2&url=/samplecode/FSCopyObject/listing4.html%3Fid%3DDTS10000472-1.0&media=dvd" target=_new>It’s good, but:</a> Report typos, inaccuracies, and so forth.</div>
<div><a href="http://developer.apple.com/feedback/?v=3&url=/samplecode/FSCopyObject/listing4.html%3Fid%3DDTS10000472-1.0&media=dvd" target=_new>It wasn’t helpful</a>: Tell us what would have helped.</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- START BOTTOM APPLE NAVIGATION -->
<!--#include virtual="/includes/footer"-->
<!-- END BOTTOM APPLE NAVIGATION -->
<!-- START CENTER CLOSE -->
</center>
<!-- END CENTER CLOSE -->
</body>
</html>