如何检查一个文件是否存在于Swift的Documents目录下?

如何检查一个文件是否存在于Swift的Documents目录下?

我正在使用[ .writeFilePath ]方法将图像保存到Documents目录中,每次启动应用程序时都要加载它。 但是如果没有保存的图像,我有一个默认图像。

但我只是不能得到我的头如何使用[ func fileExistsAtPath(_:) ]函数。 有人可以给一个使用该函数的pathparameter passing给它的例子。

我相信我不需要粘贴任何代码,因为这是一个通用的问题。 任何帮助都感激不尽。

干杯

Swift 2.0版本,需要使用URLByAppendingPathComponent

  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") } 

Swift 3.0版本

  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 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"); } 

如今(2016年),苹果推荐越来越多地使用NSURLNSFileManager等URL相关的API。

在iOS和Swift 2中使用文档目录

 let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) 

try! 在这种情况下是安全的,因为这个标准目录是保证存在的。

然后附加适当的path组件,例如一个sqlite文件

 let databaseURL = documentDirectoryURL.URLByAppendingPathComponent("MyDataBase.sqlite") 

现在检查文件是否存在与NSURL checkResourceIsReachableAndReturnError

 let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil) 

如果你需要错误传递参数的NSError指针。

 var error : NSError? let fileExists = databaseURL.checkResourceIsReachableAndReturnError(&error) if !fileExists { print(error) } 

Swift 3:

在Swift 3中checkResourceIsReachable被标记为可以抛出

 do { let fileExists = try databaseURL.checkResourceIsReachable() // handle the boolean result } catch let error as NSError { print(error) } 

要仅考虑布尔返回值并忽略错误,请使用nil-coalescing运算符

 let fileExists = (try? databaseURL.checkResourceIsReachable()) ?? false 

这是非常用户友好的。 只需要使用NSFileManager的defaultManager单例,然后使用fileExistsAtPath()方法, fileExistsAtPath()需要一个string作为参数,并返回一个Bool,允许它直接放在if语句中。

 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!! } 

请注意,在Swift 2中downcast转换为String是不必要的。

为了Swift 3初学者的利益:

  1. Swift 3已经取消了大部分NextStep语法
  2. 所以NSURL,NSFilemanager,NSSearchPathForDirectoriesInDomain不再使用
  3. 而是使用URL和FileManager
  4. NSSearchPathForDirectoriesInDomain不需要
  5. 而是使用FileManager.default.urls

下面是一个代码示例,用于validation应用程序文档目录中是否存在名为“database.sqlite”的文件:

 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)") } } 

Swift 3中的替代/推荐的代码模式将是:

  1. 使用URL而不是FileManager
  2. 使用exception处理

     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)") } } 

很简单:如果你的path是一个URL实例通过'path'方法转换为string。

  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 } } 

您必须在文件名之前添加“/”斜线,否则您将获得像“… / DocumentsFilename.jpg”