casademora
casademora

Reputation: 69767

Why can't I write files to my app's Document directory?

I have found several snippets of code describing how to write data to a user's application Documents folder. However, when I try this out in the iPhone simulator, no files get created. I called

[NSFileManager isWritbleAtPath:<my document folder>]

and it returned 0 (false). Do I need to make this folder explicitly writable, and if so, how do I do it?

Upvotes: 2

Views: 2296

Answers (4)

Ksinak
Ksinak

Reputation: 429

I had a trivial issue with the file writing to NSBundle. I had a requirement where a text file needs to be updated with the server as soon as app launches and it worked well with the simulator but not with the device. I later found out that we don't have write permission with NSBundle. Copying the file into Documents directory from NSBundle and using for my purpose solved my problem. I use : [myPlistData writeToFile:fileName atomically:NO];

Upvotes: 0

casademora
casademora

Reputation: 69767

Thanks for the pointers. So after a toiling through a few documents, I found the thing I was doing wrong: trying to save an NSArray that wasn't composed of basic datatypes such as NSDictionary, NSArray, or NSString. I was trying to save an array of MPMediaItems (from the MediaKit Framework in SDK 3.0+).

Upvotes: 0

drvdijk
drvdijk

Reputation: 5554

NSLog(@"writable: %d", [[NSFileManager defaultManager] isWritableFileAtPath:NSHomeDirectory()]);

This prints 1 on the console.

Did you mean to call the method isWritableAtPath or isWritableFileAtPath ? And did you mean to call it on the class itself, or on a (default) instance of it?

Upvotes: 1

Ben Gotow
Ben Gotow

Reputation: 14893

The iPhone simulator should be able to write to the entire disk. My app routinely dumps test files to the root level of my boot volume (using [NSData's writeToPath:@"/test.jpg" atomically:NO]).

Are you sure that you've correctly determined the path to the documents folder? You need to expand the tilde in the path. Here's the code my app uses to put things in the documents folder. I don't think there's any more setup involved!

brushesDir = [[@"~/Documents/BrushPacks/" stringByExpandingTildeInPath] retain];
// create brush packs folder if it does not exist
if (![[NSFileManager defaultManager] fileExistsAtPath: brushesDir])
            [[NSFileManager defaultManager] createDirectoryAtPath:brushesDir withIntermediateDirectories:YES attributes:nil error:nil];

Upvotes: 2

Related Questions