fileManager.createFileAtPath always fails

user1895268 picture user1895268 · Jan 28, 2016 · Viewed 7.5k times · Source

I try to call the fileManager.createFileAtPath-method, but it always fails. My variable success is always false. I looked at some similar posts here but nothing fits my needs exactly. Here is my code:

pListPath = NSURL(fileURLWithPath: String(reportsPath)).URLByAppendingPathComponent("myReports.plist", isDirectory: false)

                let data: NSData = NSData()
                var isDir: ObjCBool = false

            if fileManager.fileExistsAtPath(String(pListPath), isDirectory: &isDir)
                {
                    print("File already exists")
                }
                else
                {

                    let success = fileManager.createFileAtPath(String(pListPath), contents: data, attributes: nil)

                    print("Was file created?: \(success)")
                    print("plistPath: \(pListPath)")
                }

Here is how i tried to fix this:

I tried to use the method

let success = NSFileManager.defaultManager().createFileAtPath(String(pListPath), contents: data, attributes: nil)

And also

let success = data.writeToFile(String(pListPath), atomically: true)

But nothing works. successis always false. I also tried to give it a literal-String as a path, set contentsto nil and I even changed the directory permissions where i want to put it to 777, but noting works. successis always false. I hope you can me help out of this. Any help is highly appreciate. Thank you

Answer

Martin R picture Martin R · Jan 28, 2016

Here is a problem:

if fileManager.fileExistsAtPath(String(pListPath), isDirectory: &isDir)

You cannot use String(...) to convert a NSURL to a file path string, you have to use the path method:

if fileManager.fileExistsAtPath(pListPath.path!, isDirectory: &isDir)

If reportsPath is also an NSURL then the same problem exists at

pListPath = NSURL(fileURLWithPath: String(reportsPath)).URLByAppendingPathComponent("myReports.plist", isDirectory: false)

which should be

let pListPath = reportsPath.URLByAppendingPathComponent("myReports.plist", isDirectory: false)