Waynar Bocangel
Waynar Bocangel

Reputation: 43

Swift MoveItem fails due to file "does not exist"

So I'm trying to rename a folder within my app, but the moveItem method is behaving strangely. Here is my code:

try FileManager.default.moveItem(at: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("parentFolder").appendingPathComponent("folderIWantToMove"), to: FileManager.default.urls(for: .applicationDirectory, in: .userDomainMask)[0].appendingPathComponent("parentFolder").appendingPathComponent("newFolderName"))

This fails and the message in the debugger is:

“folderIWantToMove” couldn’t be moved to “parentFolder” because either the former doesn’t exist, or the folder containing the latter doesn’t exist.

But when I run this in the lldb:

print FileManager.default.fileExists(atPath: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("parentFolder").appendingPathComponent("folderIWantToMove").path)

and

print FileManager.default.fileExists(atPath: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("parentFolder").path)

both return true, meaning both folders do exist. I've read some other questions with similar problems and most of them say that it is because of sandboxing. If this is the case how could I be able to change the name of and erase files within the user's document directory?

Just in case, I'm using swift 5 and running everything on an iPad with iPadOS 13 from Xcode 12 beta.

Upvotes: 3

Views: 2327

Answers (2)

Leo Dabus
Leo Dabus

Reputation: 236350

The issue there is that you are not renaming it, you are trying to move your directory from inside your documents directory to the application directory which is out of your bundle and unreachable from your app in iOS.

let document = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let parentFolder = document.appendingPathComponent("parentFolder")
let folderIWantToMove = parentFolder.appendingPathComponent("folderIWantToMove")
do {
    try FileManager.default.createDirectory(at: folderIWantToMove, withIntermediateDirectories: true, attributes: nil)
    print("folder and sub folder created")
    print("folderIWantToMove path:", folderIWantToMove.path)
    // renaming it
    let newFolderName = parentFolder.appendingPathComponent("newFolderName")
    try FileManager.default.moveItem(at: folderIWantToMove, to: newFolderName)
    print("folder renamed to:", newFolderName.path)
} catch {
    print(error)
}

Upvotes: 2

da_oldspice1
da_oldspice1

Reputation: 63

I've had the same file problem, but on macOS. I fixed it by adding the "com.apple.security.files.user-selected.read-write" entitlement and setting it as true. I hope this helps! (Also, make sure to set the app sandbox entitlement to false)

Upvotes: 0

Related Questions