Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSString writeToFile, NSSavePanel and write permissions

I've only been leaning Cocoa/Objective C for a few days so apologies that this is probably simple/obvious but it's got me stumped.

I've written this handler for saving 3 floats to a text file. However when I'm running it the files are not being saved. Could anyone suggest if there's an error in my code or if you think there's something else (like file write permissions) preventing the file from being written.

Research has lead me to look into Sandboxing, but that gets confusing very quickly and I'm hoping just running the app from xcode in debug would let me write to my user directory.

Heres the code:

- (IBAction)saveResultsAction:(id)sender {

    //Sets up the data to save
    NSString *saveLens = [NSString stringWithFormat:@"Screen width is %.02f \n Screen Height is %.02f \n Lens is %.02f:1",
        self.myLens.screenWidth,
        self.myLens.screenHeight,
        self.myLens.lensRatio];

    NSSavePanel *save = [NSSavePanel savePanel];

    long int result = [save runModal];

    if (result == NSOKButton) {
        NSURL *selectedFile = [save URL];
        NSLog(@"Save URL is %@", selectedFile);
        NSString *fileName = [[NSString alloc] initWithFormat:@"%@.txt", selectedFile];
        NSLog(@"Appended URL is %@", fileName);
        [saveLens writeToFile:fileName
                   atomically:YES
                     encoding:NSUTF8StringEncoding
                        error:nil];
    }
}
like image 217
RichPorter Avatar asked Nov 24 '25 12:11

RichPorter


2 Answers

a NSURL object is no POSIX path..

its a URL and getting its description doesnt make it a path


NSString *fileName = [selectedFile.path stringByAppendingPathExtension:@"txt"];


BUT as said, you shouldnt have to append the .txt at all. just use what the panel returns. Else, there would be sandboxd errors because you dont have access rights to the modified filename :)

NSString *fileName = selectedFile.path;

like image 190
Daij-Djan Avatar answered Nov 27 '25 00:11

Daij-Djan


The problem is that you don't need to append the file extension to the URL.The extension is already there.You could directly do this:

if (result == NSOKButton)
{   
    [saveLens writeToURL: [save URL]
                atomically:YES
                  encoding:NSUTF8StringEncoding
                     error:nil];
}
like image 24
Ramy Al Zuhouri Avatar answered Nov 27 '25 02:11

Ramy Al Zuhouri



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!