Мне нужно собрать много данных о файлах изображений и фильмов в каталоге (или дереве каталогов).Это включает в себя имя файла, дату создания и изменения, размер файла (и, возможно, позже дополнительные данные, такие как размер изображения - если доступно - который здесь не рассматривается).Есть 10.000 из них.Чтобы запросить 17 000 файлов, программе необходимо 10 минут для выполнения этой задачи.Я делаю это с помощью следующего кода, но есть ли способ значительно ускорить его?
Это код, который я использую:
// get files matching extensions
func getPicFilenames(_ exts: [String]? = nil, includeFolders: Bool = false, skipHiddenFiles: Bool = true)
-> Array<URL>
{
// all to upper once (and drop optional dot)
let extUpper = exts == nil ?
[String]() :
exts!.map { ($0.hasPrefix(".") ? String($0.dropFirst(1)) : $0).uppercased() }
// let resourceKeys = [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey]
// we also need size of files
let resourceKeys = [ URLResourceKey.nameKey, URLResourceKey.isDirectoryKey,
URLResourceKey.creationDateKey, URLResourceKey.contentModificationDateKey,
URLResourceKey.attributeModificationDateKey, URLResourceKey.fileSizeKey]
var fileURLs: [URL] = []
let directoryEnumerator = FileManager().enumerator(at: self, includingPropertiesForKeys: resourceKeys,
options: skipHiddenFiles ? [.skipsHiddenFiles] : [], errorHandler: nil)!
for case let fileURL as NSURL in directoryEnumerator {
guard let resourceValues = try? fileURL.resourceValues(forKeys: resourceKeys),
let isDirectory = resourceValues[URLResourceKey.isDirectoryKey] as? Bool
else {
continue
}
// we can skip complete descendants! >> directoryEnumerator.skipDescendants()
if !isDirectory || (isDirectory && includeFolders) {
if let ext = fileURL.pathExtension {
// matching extension? (ignore case!)
if extUpper.count == 0 || extUpper.contains((ext.uppercased())) {
fileURLs.append( fileURL.absoluteURL! )
}
}
}
}
return fileURLs
}
Это требует 1 минуты на 1,700 файлов,Если мы анализируем файлы размером 100 000 с, то это должно быть намного быстрее (если это возможно).
Я использую Swift 4.2 на XCode 10.1 с OSX 10.11.6.