파일의 Documents 디렉토리에 파일이 있는지 확인하는 방법은 Swift
무엇입니까?
[ .writeFilePath ]
이미지를 Documents 디렉토리에 저장하는 방법을 사용 하고 있으며 앱을 시작할 때마다 이미지를로드하려고합니다. 그러나 저장된 이미지가 없으면 기본 이미지가 있습니다.
그러나 나는 그 [ func fileExistsAtPath(_:) ]
기능 을 사용하는 방법에 대해 머리를 숙일 수 없다. 누군가가 전달 된 경로 인수와 함께 함수를 사용하는 예를 줄 수 있습니까?
일반적인 질문이므로 코드를 붙여 넣을 필요가 없습니다. 도움을 주시면 감사하겠습니다.
건배
답변
스위프트 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")
}
답변
아래 코드를 확인하십시오.
스위프트 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");
}
답변
요즘 (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")
파일이 존재하는 경우 지금 검사 checkResourceIsReachableAndReturnError
의 NSURL
.
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
답변
꽤 사용자 친화적입니다. 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 3 의 대안 / 권장 코드 패턴 은 다음과 같습니다.
- FileManager 대신 URL 사용
-
예외 처리 사용
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)") } }
답변
스위프트 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 3 초보자를위한 혜택 :
- Swift 3는 대부분의 NextStep 구문을 제거했습니다.
- 따라서 NSURL, NSFilemanager, NSSearchPathForDirectoriesInDomain은 더 이상 사용되지 않습니다
- 대신 URL과 FileManager를 사용하십시오.
- NSSearchPathForDirectoriesInDomain은 필요하지 않습니다
- 대신 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)")
}
}