2014-06-12 244 views
72

如何檢查文件目錄中是否存在文件Swift如何檢查Swift文檔目錄中是否存在文件?

我正在使用[ .writeFilePath ]方法將圖像保存到Documents目錄中,並且我希望在每次啓動應用程序時加載它。但是如果沒有保存的圖像,我有一個默認圖像。

但我只是不能讓我的頭在如何使用[ func fileExistsAtPath(_:) ]函數。有人可以舉一個例子來說明如何使用帶有傳遞給它的路徑參數的函數。

我相信我不需要粘貼任何代碼,因爲這是一個通用的問題。任何幫助都感激不盡。

乾杯

回答

130

斯威夫特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") 
    } 

斯威夫特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") 
    } 

斯威夫特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") 
    } 
+0

只要Swift 2.2是活的,這應該是一個被接受的答案。謝謝。 –

+0

它看起來像答案已更新,所以absoluteString評論似乎已過時。 – Efren

13

這是非常用戶友好。只需使用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!! 
} 

注意,向下轉換爲字符串是沒有必要在夫特2.

+0

♦請幫我在這裏http://stackoverflow.com/questions/31503283/how-to-get-nsurl-on-specific-file-from-document-directory-in-swift。我不知道哪些代碼需要編寫。 – Alexander

33

檢查下面的代碼:

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

夫特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"); 
} 
+1

不適用於Swift 2.0 –

+3

@SaqibOmer嘗試將路徑轉換爲NSString而不是String。 'var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)[0] as NSString' – sheepgobeep

+0

現已更新至Swift 2.0。對不起後期更新。 – PREMKUMAR

0

您必須添加一個 「/」 文件名前斜線,或你得到這樣的路徑 「.../DocumentsFilename.jpg」

21

如今(2016)蘋果建議越來越多地使用NSURL的URL相關的API,NSFileManager

要在iOS的文件目錄和斯威夫特2使用

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

try!在這種情況下是安全的,因爲這個標準目錄是保證存在的。

然後追加適當的路徑成分例如一個sqlite文件

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

現在檢查如果文件與NSURLcheckResourceIsReachableAndReturnError存在。

let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil) 

如果您需要錯誤,則將指針NSError傳遞給參數。

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

斯威夫特3:

在斯威夫特3 checkResourceIsReachable被標記爲可以拋出

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

只考慮布爾返回值,並忽略錯誤使用零 - 結合運營商

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

我認爲在Swift 3中現在是'checkResourceIsReachable()',並且剛剛爲'URL'類型返回'Bool'。 –

+0

@EthanAllen謝謝,我更新了答案。 – vadian

+0

我發現的問題是,你似乎從Swift3中的checkResourceIsReachable()獲取「false」值,如果該文件不存在,那麼只是一個例外。我不太喜歡使用API​​,其中很多調用會導致異常而不是簡單的返回值。 –

4

對於斯威夫特3個初學者的好處:

  1. 斯威夫特3已經擺脫了大部分的NextStep自動語法
  2. 所以NSURL,的NSFileManager,NSSearchPathForDirectoriesInDomain不再使用
  3. 而是使用URL和文件管理器
  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)") 
    } 

} 
5

一種替代在/推薦碼模式夫特3將是:

  1. 使用URL而不是文件管理
  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)") 
        } 
    } 
    
2

非常簡單: 如果你的路徑是一個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 
     } 
    }