Как проверить, существует ли файл в каталоге Documents в Swift?
Как проверить, существует ли файл в каталоге Documents в Swift
?
я использую [ .writeFilePath ]
способ сохранить изображение в каталоге документов, и я хочу загружать его каждый раз, когда приложение запускается. Но у меня есть изображение по умолчанию, если нет сохраненного изображения.
Но я просто не могу понять, как использовать [ func fileExistsAtPath(_:) ]
функция. Может ли кто-нибудь привести пример использования функции с переданным в нее аргументом пути.
Я считаю, что мне не нужно вставлять туда какой-либо код, так как это общий вопрос. Любая помощь будет высоко ценится.
ура
13 ответов
Версия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")
}
Проверьте код ниже:
Swift 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 г.) Apple рекомендует все больше и больше использовать API, связанный с URL 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) }
Свифт 3:
В Свифт 3 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
Swift 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 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"
- расширение файла
Это довольно удобно для пользователя. Просто поработайте с синглтоном defaultManager NSFileManager, а затем используйте 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 5
extension FileManager {
class func fileExists(filePath: String) -> Bool {
var isDirectory = ObjCBool(false)
return self.default.fileExists(atPath: filePath, isDirectory: &isDirectory)
}
}
Альтернативный / рекомендуемый шаблон кода в Swift 3 будет:
- Используйте URL вместо FileManager
Использование обработки исключений
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)") } }
Очень просто: если ваш путь является экземпляром 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 покончил с большей частью синтаксиса 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)")
}
}
Это прекрасно работает для меня в 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
}
Надеюсь это кому-нибудь пригодится. @;-]
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)
}
Я поставил проверку в моей функции loadData, которую я вызвал в viewDidLoad.
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...")
}
}
Вы должны добавить косую черту "/" перед именем файла, или вы получите путь вроде ".../DocumentsFilename.jpg"