You can use NSFileWrapper
as a package directory in document-based applications.
In your application Info.plist file, state that your document type is a package or bundle (key LSTypeIsPackage
with value YES
).
In your NSDocument
subclass, implement the following methods for reading and writing. In this example, I’m assuming the corresponding model instance variables are pdfData
and signatureBitmapData
, which are stored in the package directory under MainDocument.pdf and SignatureBitmap.png, respectively.
- (BOOL)readFromFileWrapper:(NSFileWrapper *)dirWrapper
ofType:(NSString *)typeName
error:(NSError **)outError
{
NSFileWrapper *wrapper;
NSData *data;
wrapper = [[dirWrapper fileWrappers] objectForKey:@"MainDocument.pdf"];
data = [wrapper regularFileContents];
self.pdfData = data;
wrapper = [[dirWrapper fileWrappers] objectForKey:@"SignatureBitmap.png"];
data = [wrapper regularFileContents];
self.signatureBitmapData = data;
…
return YES;
}
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
error:(NSError **)outError
{
NSFileWrapper *dirWrapper = [[[NSFileWrapper alloc]
initDirectoryWithFileWrappers:nil] autorelease];
[dirWrapper addRegularFileWithContents:self.pdfData
preferredFilename:@"MainDocument.pdf"];
[dirWrapper addRegularFileWithContents:self.signatureBitmapData
preferredFilename:@"SignatureBitmap.png"];
…
return dirWrapper;
}
From the user perspective, the package directory shows up in Finder as if it were a single file, much like Xcode .xcodeproj directories or application bundles.