如何检查Swift中Documents文件目录中是否存在文件?

Ggn*_*ngh 118 xcode ios swift

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

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

但我无法理解如何使用该[ func fileExistsAtPath(_:) ]功能.有人可以给出一个使用函数的示例,并将路径参数传递给它.

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

干杯

mik*_*hik 221

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")
    }
Run Code Online (Sandbox Code Playgroud)

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")
    }
Run Code Online (Sandbox Code Playgroud)

Swift 2.x版本,需要使用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")
    }
Run Code Online (Sandbox Code Playgroud)


PRE*_*MAR 33

检查以下代码:

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");
}
Run Code Online (Sandbox Code Playgroud)

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");
}
Run Code Online (Sandbox Code Playgroud)

  • @SaqibOmer尝试将路径转换为NSString而不是String.`var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)[0] as NSString` (3认同)

vad*_*ian 27

如今(2016)苹果建议越来越多使用的URL相关的API NSURL,NSFileManager等等.

要在iOS和文档目录斯威夫特2使用

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

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

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

let databaseURL = documentDirectoryURL.URLByAppendingPathComponent("MyDataBase.sqlite")
Run Code Online (Sandbox Code Playgroud)

现在,检查文件是否存在用checkResourceIsReachableAndReturnErrorNSURL.

let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil)
Run Code Online (Sandbox Code Playgroud)

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

var error : NSError?
let fileExists = databaseURL.checkResourceIsReachableAndReturnError(&error)
if !fileExists { print(error) }
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

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

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

let databaseURL = documentDirectoryURL.appendingPathComponent("MyDataBase.sqlite")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我知道它更有效率,但从概念上讲我不喜欢它。我不介意抛出异常的东西 - 异常。但是不存在的文件也不例外。这是一种常见情况,应该导致错误的返回值,而不是必须创建的包装错误对象的某种异常。这可能看起来不多,但如果您有数万个文件要检查,负担就太重了。 (2认同)

Mic*_*lum 15

它非常友好.只需使用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!!
}
Run Code Online (Sandbox Code Playgroud)

请注意,在Swift 2中不需要向下转换为String.


Lak*_*ngh 12

斯威夫特 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用: -

if fileUrl.checkFileExist()
   {
      // Do Something
   }
Run Code Online (Sandbox Code Playgroud)


Ale*_*ano 8

雨燕5

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


nas*_*sia 6

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)
    }
Run Code Online (Sandbox Code Playgroud)

其中"userInfo"- 文件名,以及"sqlite3"- 文件的扩展名


Sur*_*avi 5

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)")
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


Roh*_*dia 5

非常简单:如果你的路径是一个 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
        }
    }
Run Code Online (Sandbox Code Playgroud)