Swift의 Documents 디렉토리에 파일이 있는지 확인하는 방법은 무엇입니까?


127

파일의 Documents 디렉토리에 파일이 있는지 확인하는 방법은 Swift무엇입니까?

[ .writeFilePath ]이미지를 Documents 디렉토리에 저장하는 방법을 사용 하고 있으며 앱을 시작할 때마다 이미지를로드하려고합니다. 그러나 저장된 이미지가 없으면 기본 이미지가 있습니다.

그러나 나는 그 [ func fileExistsAtPath(_:) ]기능 을 사용하는 방법에 대해 머리를 숙일 수 없다. 누군가가 전달 된 경로 인수와 함께 함수를 사용하는 예를 줄 수 있습니까?

일반적인 질문이므로 코드를 붙여 넣을 필요가 없습니다. 도움을 주시면 감사하겠습니다.

건배

답변:


248

스위프트 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")
    }

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

답변이 업데이트 된 것처럼 보이므로 absoluteString 주석은 더 이상 사용되지 않는 것처럼 보입니다.
Efren

아마도 그 의견은 absoluteString은 URL에서 작동하지 않지만 경로는 작동한다는 것입니다.
CMash

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

3
@SaqibOmer는 경로를 문자열이 아닌 NSString으로 캐스팅합니다. var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
sheepgobeep

@PREMKUMAR 왜 이상한 문자열 보간인가? absoluteString변환하는 NSURL데 사용할 수는 path있지만 NSStringSwift 1.2에서와 같이 경로를 문자열 ( ) 로 유지하는 것이 좋습니다 .
Sulthan

이 답변이 Swift 2에서 제대로 작동한다는 것을 알았습니다. stackoverflow.com/a/36897617/1245231
petrsyn

27

요즘 (2016) 애플의 URL 관련 API 사용하는 것이 더 좋습니다 NSURL, NSFileManager

iOS 및의 문서 디렉토리 얻으려면 스위프트 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) }

스위프트 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-coalescing 연산자를 사용하십시오.

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

나는 스위프트 3이 지금 생각 checkResourceIsReachable()그냥 반환 Bool에 대한 URL유형입니다.
Ethan Allen

1
내가 찾은 문제는 Swift3의 checkResourceIsReachable ()에서 "false"값을 얻지 않는 것 같습니다. 파일이 없으면 예외입니다. 많은 호출로 인해 간단한 반환 값 대신 예외가 발생하는 API를 사용하는 것은별로 좋지 않습니다.
Kendall Helmstetter Gelner

@KendallHelmstetterGelner Swift의 try - catch패턴은 예외를 발생시키지 않습니다. Objective-C의 예외와 비교할 수 없습니다. 효율적인 오류 처리 시스템입니다.
vadian

1
내가 아는 것이 더 효율적이지만 개념적으로는 마음에 들지 않습니다. 나는 예외를 던지는 것을 신경 쓰지 않는다. 그러나 존재하지 않는 파일은 예외가 아닙니다. 일반적으로 발생하는 것으로 래핑 된 Error 객체로 인한 수차가 아닌 잘못된 반환 값을 가져와야합니다. 많이 보이지는 않지만 수만 개의 파일이 있다면 부담이 너무 큰지 확인하십시오.
Kendall Helmstetter Gelner

16

꽤 사용자 친화적입니다. 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으로 다운 캐스트 할 필요가 없습니다.


♦ 여기 나를 도와주세요 stackoverflow.com/questions/31503283/… . 어떤 코드를 작성해야하는지 모르겠습니다.
Alexander Khitev

6

Swift 3 의 대안 / 권장 코드 패턴 은 다음과 같습니다.

  1. FileManager 대신 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)")
        }
    }

5

스위프트 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
   }

4

Swift 3 초보자를위한 혜택 :

  1. Swift 3는 대부분의 NextStep 구문을 제거했습니다.
  2. 따라서 NSURL, NSFilemanager, NSSearchPathForDirectoriesInDomain은 더 이상 사용되지 않습니다
  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)")
    }

}

3

매우 간단합니다. 경로가 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
        }
    }

1

이것은 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

        }


}

이 전화로 확인할 수 있습니다 :

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

            // your code if file exists

           } else {

           // your code if file does not exist

           }

누군가에게 도움이되기를 바랍니다. @;-]


사용자가 문서 디렉토리 만 확인하지 않으려면 어떻게해야합니까?
Jogendra Kumar

0

파일 이름 앞에 "/"슬래시를 추가하거나 "... / DocumentsFilename.jpg"와 같은 경로를 가져와야합니다.


0

스위프트 4 예제 :

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

0

스위프트 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)
    }

where- "userInfo"파일 이름 및 "sqlite3"-파일 확장자

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.