如何在 Swift 中检查“文档”目录中是否存在文件?

如何检查文件是否存在于 Swift的“文档”目录中?

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

但是我就是不能理解如何使用 [ func fileExistsAtPath(_:) ]函数。有没有人能举个例子,说明如何使用函数中的路径参数。

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

干杯

147044 次浏览

用户界面很友好。只需使用 NSFileManager 的 defaultManager 单例,然后使用 fileExistsAtPath()方法,该方法只接受一个字符串作为参数,并返回一个 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中不需要向下转换为 String。

检查以下代码:

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

您必须在文件名之前添加一个“/”斜杠,否则将得到类似于“ .../DocumentsFilename.jpg”的路径

Swift 4.x 版本

    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 版本

    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 版本,需要使用 < strong > 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")
}

如今(2016)苹果公司越来越推荐使用 NSURLNSFileManager等与 URL 相关的 API。

要获取 iOS 和 Swift 2中的文档目录,请使用

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

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

然后附加适当的路径组件,例如 sqlite文件

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

现在检查 checkResourceIsReachableAndReturnErrorNSURL的文件是否存在。

let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil)

如果需要错误,请将 NSError指针传递给参数。

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

Swift 3 + :

let documentDirectoryURL = try! FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true)


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

checkResourceIsReachable标记为 可以扔

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

要只考虑布尔值返回值并忽略错误,请使用 nil 聚合运算符

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

为了 Swift 3初学者的利益:

  1. Swift 3废除了大部分 NextStep 语法
  2. 因此不再使用 NSURL、 NSFilemanager、 NSearchPathForDirectoriesInDomain
  3. 而是使用 URL 和 FileManager
  4. 不需要 NSSearchPathForDirectoriesInDomain
  5. 而是使用 FileManager.default.urls

下面是验证应用程序文档目录中是否存在名为“ 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. 异常处理的使用

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

很简单: 如果您的路径是一个 URL 实例,则通过“ path”方法将其转换为字符串。

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

例子:

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

我在 viewDidLoad 中调用的 loadData 函数中进行了检查。

override func viewDidLoad() {
super.viewDidLoad()


loadData()
}

然后我在下面定义了 loadData。

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

这对我来说很有效:

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


}




}

你可以打这个电话确认:

   if existingFile(fileName: "yourfilename") == true {


// your code if file exists


} else {


// your code if file does not exist


}

我希望它对某人有用

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

使用:-

if fileUrl.checkFileExist()
{
// Do Something
}

Swift 5工作

    do {
let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileUrl = documentDirectory.appendingPathComponent("userInfo").appendingPathExtension("sqlite3")
if FileManager.default.fileExists(atPath: fileUrl.path) {
print("FILE AVAILABLE")
} else {
print("FILE NOT AVAILABLE")
}
} catch {
print(error)
}

其中 "userInfo"-文件的名称,和 "sqlite3"-文件的扩展名

Swift 5

extension FileManager {
class func fileExists(filePath: String) -> Bool {
var isDirectory = ObjCBool(false)
return self.default.fileExists(atPath: filePath, isDirectory: &isDirectory)
}
}