Wie prüfe ich, ob eine Datei im Verzeichnis Dokumente in Swift
vorhanden ist?
Ich verwende die [ .writeFilePath ]
-Methode, um ein Bild im Verzeichnis Documents zu speichern, und ich möchte es jedes Mal laden, wenn die App gestartet wird. Ich habe jedoch ein Standardbild, wenn kein Bild gespeichert ist.
Aber ich kann mich einfach nicht damit beschäftigen, wie ich die Funktion [ func fileExistsAtPath(_:) ]
benutze. Könnte jemand ein Beispiel für die Verwendung der Funktion mit einem übergebenen Pfadargument geben?.
Ich glaube, ich muss dort keinen Code einfügen, da dies eine generische Frage ist. Jede Hilfe wird sehr geschätzt.
Prost
Swift 4.x Version
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = NSURL(fileURLWithPath: path)
if let pathComponent = url.appendingPathComponent("nameOfFileHere") {
let filePath = pathComponent.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath) {
print("FILE AVAILABLE")
} else {
print("FILE NOT AVAILABLE")
}
} else {
print("FILE PATH NOT AVAILABLE")
}
Swift 3.x Version
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = URL(fileURLWithPath: path)
let filePath = url.appendingPathComponent("nameOfFileHere").path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath) {
print("FILE AVAILABLE")
} else {
print("FILE NOT AVAILABLE")
}
Swift 2.x -Version, muss URLByAppendingPathComponent verwenden
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let url = NSURL(fileURLWithPath: path)
let filePath = url.URLByAppendingPathComponent("nameOfFileHere").path!
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath(filePath) {
print("FILE AVAILABLE")
} else {
print("FILE NOT AVAILABLE")
}
Überprüfen Sie den folgenden Code:
Swift 1.2
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let getImagePath = paths.stringByAppendingPathComponent("SavedFile.jpg")
let checkValidation = NSFileManager.defaultManager()
if (checkValidation.fileExistsAtPath(getImagePath))
{
println("FILE AVAILABLE");
}
else
{
println("FILE NOT AVAILABLE");
}
Swift 2.0
let paths = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let getImagePath = paths.URLByAppendingPathComponent("SavedFile.jpg")
let checkValidation = NSFileManager.defaultManager()
if (checkValidation.fileExistsAtPath("\(getImagePath)"))
{
print("FILE AVAILABLE");
}
else
{
print("FILE NOT AVAILABLE");
}
Heutzutage (2016) empfiehlt Apple immer mehr, die URL-bezogene API von NSURL
, NSFileManager
usw. zu verwenden.
Um das Dokumentenverzeichnis in iOS und Swift 2 use zu erhalten
let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory,
inDomain: .UserDomainMask,
appropriateForURL: nil,
create: true)
Der try!
ist in diesem Fall sicher, da dieses Standardverzeichnis garantiert vorhanden ist.
Hängen Sie dann die entsprechende Pfadkomponente für eine sqlite
-Datei an
let databaseURL = documentDirectoryURL.URLByAppendingPathComponent("MyDataBase.sqlite")
Prüfen Sie nun, ob die Datei mit checkResourceIsReachableAndReturnError
von NSURL
vorhanden ist.
let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil)
Wenn Sie den Fehler benötigen, übergeben Sie den Zeiger NSError
an den Parameter.
var error : NSError?
let fileExists = databaseURL.checkResourceIsReachableAndReturnError(&error)
if !fileExists { print(error) }
Swift 3:
In Swift 3 ist checkResourceIsReachable
markiert als kann werfen
do {
let fileExists = try databaseURL.checkResourceIsReachable()
// handle the boolean result
} catch let error as NSError {
print(error)
}
Um nur den booleschen Rückgabewert zu berücksichtigen und den Fehler zu ignorieren, verwenden Sie den Nullkoaleszenzoperator
let fileExists = (try? databaseURL.checkResourceIsReachable()) ?? false
Es ist ziemlich benutzerfreundlich. Arbeiten Sie einfach mit dem defaultManager-Singleton von NSFileManager und verwenden Sie dann die fileExistsAtPath()
-Methode, die einfach eine Zeichenfolge als Argument verwendet und einen Bool zurückgibt, sodass er direkt in die if-Anweisung eingefügt werden kann.
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentDirectory = paths[0] as! String
let myFilePath = documentDirectory.stringByAppendingPathComponent("nameOfMyFile")
let manager = NSFileManager.defaultManager()
if (manager.fileExistsAtPath(myFilePath)) {
// it's here!!
}
Beachten Sie, dass der Downcast auf String in Swift 2 nicht erforderlich ist.
Ein alternatives/empfohlenes Codemuster in Swift 3 wäre:
Verwendung der Ausnahmebehandlung
func verifyIfSqliteDBExists(){
let docsDir : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let dbPath : URL = docsDir.appendingPathComponent("database.sqlite")
do{
let sqliteExists : Bool = try dbPath.checkResourceIsReachable()
print("An sqlite database exists at this path :: \(dbPath.path)")
}catch{
print("SQLite NOT Found at :: \(strDBPath)")
}
}
Zum Nutzen von Swift 3 Anfängern:
Hier ein Codebeispiel, um zu überprüfen, ob eine Datei mit dem Namen "database.sqlite" im Anwendungsdokumentverzeichnis vorhanden ist:
func findIfSqliteDBExists(){
let docsDir : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let dbPath : URL = docsDir.appendingPathComponent("database.sqlite")
let strDBPath : String = dbPath.path
let fileManager : FileManager = FileManager.default
if fileManager.fileExists(atPath:strDBPath){
print("An sqlite database exists at this path :: \(strDBPath)")
}else{
print("SQLite NOT Found at :: \(strDBPath)")
}
}
Ganz einfach: Wenn es sich bei Ihrem Pfad um eine URL-Instanz handelt, konvertieren Sie sie mithilfe der Pfadmethode in eine Zeichenfolge.
let fileManager = FileManager.default
var isDir: ObjCBool = false
if fileManager.fileExists(atPath: yourURLPath.path, isDirectory: &isDir) {
if isDir.boolValue {
//it's a Directory path
}else{
//it's a File path
}
}
Swift 4 Beispiel:
var filePath: String {
//manager lets you examine contents of a files and folders in your app.
let manager = FileManager.default
//returns an array of urls from our documentDirectory and we take the first
let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
//print("this is the url path in the document directory \(String(describing: url))")
//creates a new path component and creates a new file called "Data" where we store our data array
return(url!.appendingPathComponent("Data").path)
}
Ich habe den Check in meine loadData-Funktion gestellt, die ich in viewDidLoad aufgerufen habe.
override func viewDidLoad() {
super.viewDidLoad()
loadData()
}
Dann habe ich unten loadData definiert.
func loadData() {
let manager = FileManager.default
if manager.fileExists(atPath: filePath) {
print("The file exists!")
//Do what you need with the file.
ourData = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as! Array<DataObject>
} else {
print("The file DOES NOT exist! Mournful trumpets sound...")
}
}
Das funktioniert gut für mich in Swift4:
func existingFile(fileName: String) -> Bool {
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = NSURL(fileURLWithPath: path)
if let pathComponent = url.appendingPathComponent("\(fileName)") {
let filePath = pathComponent.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath)
{
return true
} else {
return false
}
} else {
return false
}
}
Sie können mit diesem Anruf überprüfen:
if existingFile(fileName: "yourfilename") == true {
// your code if file exists
} else {
// your code if file does not exist
}
Ich hoffe es ist für jemanden nützlich. @; -]
Swift 4.2
extension URL {
func checkFileExist() -> Bool {
let path = self.path
if (FileManager.default.fileExists(atPath: path)) {
print("FILE AVAILABLE")
return true
}else {
print("FILE NOT AVAILABLE")
return false;
}
}
}
Verwenden: -
if fileUrl.checkFileExist()
{
// Do Something
}
Sie müssen vor dem Dateinamen einen Schrägstrich "/" hinzufügen, oder Sie erhalten einen Pfad wie ".../DocumentsFilename.jpg".