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")
다음 파일이 있는지 확인합니다.checkResourceIsReachableAndReturnError
의NSURL
.
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의 대체/권장 코드 패턴은 다음과 같습니다.
- File Manager 대신 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)") } }
스위프트 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 초보자용:
- Swift 3은 대부분의 Next Step 구문을 제거했습니다.
- 따라서 NSURL, NSFile Manager, NSSearchPathForDirectories는InDomain은 더 이상 사용되지 않습니다.
- 대신 URL과 FileManager를 사용합니다.
- NSSearch Path For DirectorysInDomain은 필요 없습니다.
- 대신 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
'itsource' 카테고리의 다른 글
선택 안 함 Excel vba 고정 창 (0) | 2023.04.17 |
---|---|
git 풀 실행 취소, 저장소를 이전 상태로 되돌리는 방법 (0) | 2023.04.17 |
PowerShell에서 명령 실행 타이밍 설정 (0) | 2023.04.17 |
명령줄 인수를 Bash에서 배열로 변환 (0) | 2023.04.17 |
상각된 상수 시간 동안 R의 목록에 개체를 추가하시겠습니까, O(1)? (0) | 2023.04.17 |