我的代码在文档文件夹中获取文件名有什么问题?
func listFilesFromDocumentsFolder() -> [NSString]?{
var theError = NSErrorPointer()
let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
if dirs != nil {
let dir = dirs![0] as NSString
let fileList = NSFileManager.defaultManager().contentsOfDirectoryAtPath(dir, error: theError) as [NSString]
return fileList
}else{
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
我以为我正确阅读了文档,我非常确定文档文件夹中的内容,但"fileList"没有显示任何内容?"dir"显示文件夹的路径.
Leo*_*bus 233
Xcode 8.1•Swift 3.0.1
// Get the document directory url
let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
do {
// Get the directory contents urls (including subfolders urls)
let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil)
print(directoryContents)
// if you want to filter the directory contents you can do like this:
let mp3Files = directoryContents.filter{ $0.pathExtension == "mp3" }
print("mp3 urls:",mp3Files)
let mp3FileNames = mp3Files.map{ $0.deletingPathExtension().lastPathComponent }
print("mp3 list:", mp3FileNames)
} catch {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
Kar*_*tor 88
这是一个适用于Swift 4/Xcode 9.2的解决方案:
let fileManager = FileManager.default
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
do {
let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil)
// process files
} catch {
print("Error while enumerating files \(documentsURL.path): \(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)
Nik*_*tin 17
SWIFT 3的语法较短
func listFilesFromDocumentsFolder() -> [String]?
{
let fileMngr = FileManager.default;
// Full path to documents directory
let docs = fileMngr.urls(for: .documentDirectory, in: .userDomainMask)[0].path
// List all contents of directory and return as [String] OR nil if failed
return try? fileMngr.contentsOfDirectory(atPath:docs)
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
override func viewDidLoad()
{
print(listFilesFromDocumentsFolder())
}
Run Code Online (Sandbox Code Playgroud)
测试xCode 8.2.3 for iPhone 7,iOS 10.2和iPad,iOS 9.3
简单而动态的解决方案(Swift 5):
extension FileManager {
class func directoryUrl() -> URL? {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths.first
}
class func allRecordedData() -> [URL]? {
if let documentsUrl = FileManager.directoryUrl() {
do {
let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil)
return directoryContents.filter{ $0.pathExtension == "m4a" }
} catch {
return nil
}
}
return nil
}}
Run Code Online (Sandbox Code Playgroud)
Apple声明NSSearchPathForDirectoriesInDomains(_:_:_:)
:
您应该考虑使用
FileManager
方法urls(for:in:)
和url(for:in:appropriateFor:create:)
返回URL,这是首选格式.
使用Swift 3,FileManager
有一个叫做的方法contentsOfDirectory(at:includingPropertiesForKeys:options:)
.contentsOfDirectory(at:includingPropertiesForKeys:options:)
有以下声明:
对指定目录执行浅层搜索,并返回包含项的URL.
func contentsOfDirectory(at url: URL, includingPropertiesForKeys keys: [URLResourceKey]?, options mask: FileManager.DirectoryEnumerationOptions = []) throws -> [URL]
Run Code Online (Sandbox Code Playgroud)
因此,为了检索文档目录中包含的文件的URL,您可以使用以下使用FileManager
's urls(for:in:)
和contentsOfDirectory(at:includingPropertiesForKeys:options:)
方法的代码片段:
guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
do {
let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil, options: [])
// Print the urls of the files contained in the documents directory
print(directoryContents)
} catch {
print("Could not search for urls of files in documents directory: \(error)")
}
Run Code Online (Sandbox Code Playgroud)
作为示例,UIViewController
下面的实现显示了如何将文件从app bundle保存到文档目录,以及如何获取保存在documents目录中的文件的url:
import UIKit
class ViewController: UIViewController {
@IBAction func copyFile(_ sender: UIButton) {
// Get file url
guard let fileUrl = Bundle.main.url(forResource: "Movie", withExtension: "mov") else { return }
// Create a destination url in document directory for file
guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
let documentDirectoryFileUrl = documentsDirectory.appendingPathComponent("Movie.mov")
// Copy file to document directory
if !FileManager.default.fileExists(atPath: documentDirectoryFileUrl.path) {
do {
try FileManager.default.copyItem(at: fileUrl, to: documentDirectoryFileUrl)
print("Copy item succeeded")
} catch {
print("Could not copy file: \(error)")
}
}
}
@IBAction func displayUrls(_ sender: UIButton) {
guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
do {
let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil, options: [])
// Print the urls of the files contained in the documents directory
print(directoryContents) // may print [] or [file:///private/var/mobile/Containers/Data/Application/.../Documents/Movie.mov]
} catch {
print("Could not search for urls of files in documents directory: \(error)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码打印出我的文档目录中的所有目录和文件:
对功能的一些修改:
func listFilesFromDocumentsFolder() -> [String]
{
var theError = NSErrorPointer()
let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
if dirs != nil {
let dir = dirs![0]
let fileList = NSFileManager.defaultManager().contentsOfDirectoryAtPath(dir, error: theError)
return fileList as! [String] // edit: added ! for Swift 1.2 compatibitily
}else{
let fileList = [""]
return fileList
}
}
Run Code Online (Sandbox Code Playgroud)
调用者:
let fileManager:NSFileManager = NSFileManager.defaultManager()
var fileList = listFilesFromDocumentsFolder()
let count = fileList.count
var isDir:Bool = true;
for var i:Int = 0; i < count; i++
{
if fileManager.fileExistsAtPath(fileList[i]) != true
{
println("File is \(fileList[i])")
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
105810 次 |
最近记录: |