itsource

Swift의 Documents 디렉토리에 파일이 있는지 확인하는 방법

mycopycode 2023. 4. 17. 21:48
반응형

Swift의 Documents 디렉토리에 파일이 있는지 확인하는 방법

의 Documents 디렉토리에 파일이 있는지 확인하는 방법Swift?

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

하지만 어떻게 사용하는지 이해가 안 돼요[ func fileExistsAtPath(_:) ]기능.path 인수가 전달된 함수를 사용하는 예를 들어줄 수 있나요?

일반적인 질문이기 때문에 거기에 코드를 붙일 필요는 없다고 생각합니다.어떤 도움이라도 주시면 대단히 감사하겠습니다.

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 버전, 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")
    }

다음 코드를 확인합니다.

스위프트 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년) 애플은 다음의 URL 관련 API를 사용하는 것을 점점 더 권장하고 있다.NSURL,NSFileManager기타.

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

부울 반환 값만 고려하고 오류를 무시하려면 null-coalescing 연산자를 사용합니다.

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

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

매우 사용하기 편리합니다.NSFileManager의 defaultManager singleton으로 작업한 후fileExistsAtPath()method: 단순히 문자열을 인수로 사용하고 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 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 3의 대체/권장 코드 패턴은 다음과 같습니다.

  1. File Manager 대신 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

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

매우 심플:경로가 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
        }
    }

Swift 3 초보자용:

  1. Swift 3은 대부분의 Next Step 구문을 제거했습니다.
  2. 따라서 NSURL, NSFile Manager, NSSearchPathForDirectories는InDomain은 더 이상 사용되지 않습니다.
  3. 대신 URL과 FileManager를 사용합니다.
  4. NSSearch Path For DirectorysInDomain은 필요 없습니다.
  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)")
    }

}

이것은 나에게 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

           }

누군가에게 도움이 되었으면 좋겠어요.@;-]

파일 이름 앞에 "/" 슬래시를 추가해야 합니다. 그렇지 않으면 "..."와 같은 경로를 얻을 수 있습니다./DocumentsFilename.jpg"

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

언급URL : https://stackoverflow.com/questions/24181699/how-to-check-if-a-file-exists-in-the-documents-directory-in-swift

반응형