I am saving files in a document directory in swift 3 with this code:
fileManager = FileManager.default
// let documentDirectory = fileManager?.urls(for: .documentDirectory, in: .userDomainMask).first as String
var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
path = path + name
let image = #imageLiteral(resourceName: "Notifications")
let imageData = UIImageJPEGRepresentation(image, 0.5)
let bool = fileManager?.createFile(atPath: path, contents: imageData, attributes: nil)
print("bool is \(bool)")
return true
But as you can see, I am not using filemanager
to get document directory path as filemanager
gives only URL not string.
Questions:
Every iOS app gets a slice of storage just for itself, meaning that you can read and write your app's files there without worrying about colliding with other apps. This is called the user's documents directory, and it's exposed both in code (as you'll see in a moment) and also through iTunes file sharing.
Swift – Create Directory at Specific Path To create a Directory at specific path in Swift, call createDirectory() function on the file manager object. The following code snippet creates Directory at path “/ab/cd/”. withIntermediateDirectories: true creates intermediate directories if not present.
FileManager offers a convenient way to create, read, move, copy, and delete both files and directories, whether they're on local or networked drives or iCloud ubiquitous containers. The common currency for all of these operations are paths and file URLs.
Please think the other way round.
URL
is the recommended way to handle file paths because it contains all convenience methods for appending and deleting path components and extensions – rather than String
which Apple has removed those methods from.
You are discouraged from concatenating paths like path = path + name
. It's error-prone because you are responsible for all slash path separators.
Further you don't need to create a file with FileManager
. Data
has a method to write data to disk.
let fileManager = FileManager.default
do {
let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false)
let fileURL = documentDirectory.appendingPathComponent(name)
let image = #imageLiteral(resourceName: "Notifications")
if let imageData = image.jpegData(compressionQuality: 0.5) {
try imageData.write(to: fileURL)
return true
}
} catch {
print(error)
}
return false
following the above example given by vadian the only line you need to save a (Data)file in Document Directory is:
try imageData.write(to: fileURL)
Getting the file path is the interesting part
ex: create the file path
func createNewDirPath( )->URL{
let dirPathNoScheme = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
//add directory path file Scheme; some operations fail w/out it
let dirPath = "file://\(dirPathNoScheme)"
//name your file, make sure you get the ext right .mp3/.wav/.m4a/.mov/.whatever
let fileName = "thisIsYourFileName.mov"
let pathArray = [dirPath, fileName]
let path = URL(string: pathArray.joined(separator: "/"))
//use a guard since the result is an optional
guard let filePath = path else {
//if it fails do this stuff:
return URL(string: "choose how to handle error here")!
}
//if it works return the filePath
return filePath
}
call the function:
let shinnyNewURLpath = createNewDirPath( )
//write data to file using one line in do/catch operation
do {
try yourDataObject?.write(to: shinnyNewURLpath)
}
catch {
print("catch error",error.localizedDescription)
}
I use the following method for creating "Test.txt" file. Hope it helps you.
func createFile() {
let fileName = "Test"
let documentDirURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileURL = documentDirURL.appendingPathComponent(fileName).appendingPathExtension("txt")
print("File PAth: \(fileURL.path)")
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With