按 Swift 中的创建日期对文件属性数组进行排序
Sorting arrays of file attributes by their creation date in Swift
我一直在使用 Swift 的 [enumerator(at:includingPropertiesForKeys:options:)]
1 来查找给定基本路径中的所有文件,并为不同的资源键(文件名、路径、创建日期)创建数组, ETC)。这很有效,但我注意到创建的数组中的元素没有按创建日期排序,这是我在将这些数组的元素传递到循环中以按日期顺序上传每个文件之前需要的。
因此,我需要以某种方式按创建日期对所有结果数组的元素进行排序,属性 我可以在其自己的数组中提取(使用 .creationDateKey 资源键)。因此我有两个选择(我认为):
- 强制元素在创建日期前首先附加到原始数组
- 使用包含文件创建日期的数组对每个创建的数组的元素进行排序
最好的方法是什么?我以为它会很简单,但没有发现它。
我们欣然接受了所有建议。
谢谢
这是我的代码:
// get URL(s) and other attributes of file(s) to be uploaded
let localFileManager = FileManager()
let resourceKeys = Set<URLResourceKey>([.nameKey, .pathKey, .creationDateKey, .isDirectoryKey])
let directoryEnumerator = localFileManager.enumerator(at: baseURL, includingPropertiesForKeys: Array(resourceKeys), options: .skipsHiddenFiles)!
var fileURLs: [URL] = []
var fileNames: [String] = []
var filePaths: [String] = []
var fileDates: [Date] = []
for case let fileURL as URL in directoryEnumerator {
guard let resourceValues = try? fileURL.resourceValues(forKeys: resourceKeys),
let isDirectory = resourceValues.isDirectory,
let name = resourceValues.name,
let path = resourceValues.path,
let date = resourceValues.creationDate,
else {
continue
}
if isDirectory {
if name == "_extras" { // use this to exclude a given directory
directoryEnumerator.skipDescendants()
}
} else {
// append elements in date order here?
fileURLs.append(fileURL) // full URLs of files
fileNames.append(name) // file names only
filePaths.append(path) // paths of file
fileDates.append(date) // date and time that file was created
// sort arrays by creation date here?
}
}
print(fileURLs)
print(fileNames)
print(filePaths)
print(fileDates)
您不应为此使用多个数组,而应将您的值包装在自定义结构中
struct FileInfo {
let url: URL
let name: String
let path: String //this is not really needed, you can get it from the url
let date: Date
}
并为此准备一个数组
var files: [FileInfo]()
并创建您的结构实例并附加它
files.append(FileInfo(url: fileURL, name: name, path: path, date: date)
排序现在变得很简单,所以在 for 循环之后你就可以了
files.sort(by: { [=13=].date < .date })
这个是升序排列的,不知道你要哪个。
我一直在使用 Swift 的 [enumerator(at:includingPropertiesForKeys:options:)]
1 来查找给定基本路径中的所有文件,并为不同的资源键(文件名、路径、创建日期)创建数组, ETC)。这很有效,但我注意到创建的数组中的元素没有按创建日期排序,这是我在将这些数组的元素传递到循环中以按日期顺序上传每个文件之前需要的。
因此,我需要以某种方式按创建日期对所有结果数组的元素进行排序,属性 我可以在其自己的数组中提取(使用 .creationDateKey 资源键)。因此我有两个选择(我认为):
- 强制元素在创建日期前首先附加到原始数组
- 使用包含文件创建日期的数组对每个创建的数组的元素进行排序
最好的方法是什么?我以为它会很简单,但没有发现它。
我们欣然接受了所有建议。 谢谢
这是我的代码:
// get URL(s) and other attributes of file(s) to be uploaded
let localFileManager = FileManager()
let resourceKeys = Set<URLResourceKey>([.nameKey, .pathKey, .creationDateKey, .isDirectoryKey])
let directoryEnumerator = localFileManager.enumerator(at: baseURL, includingPropertiesForKeys: Array(resourceKeys), options: .skipsHiddenFiles)!
var fileURLs: [URL] = []
var fileNames: [String] = []
var filePaths: [String] = []
var fileDates: [Date] = []
for case let fileURL as URL in directoryEnumerator {
guard let resourceValues = try? fileURL.resourceValues(forKeys: resourceKeys),
let isDirectory = resourceValues.isDirectory,
let name = resourceValues.name,
let path = resourceValues.path,
let date = resourceValues.creationDate,
else {
continue
}
if isDirectory {
if name == "_extras" { // use this to exclude a given directory
directoryEnumerator.skipDescendants()
}
} else {
// append elements in date order here?
fileURLs.append(fileURL) // full URLs of files
fileNames.append(name) // file names only
filePaths.append(path) // paths of file
fileDates.append(date) // date and time that file was created
// sort arrays by creation date here?
}
}
print(fileURLs)
print(fileNames)
print(filePaths)
print(fileDates)
您不应为此使用多个数组,而应将您的值包装在自定义结构中
struct FileInfo {
let url: URL
let name: String
let path: String //this is not really needed, you can get it from the url
let date: Date
}
并为此准备一个数组
var files: [FileInfo]()
并创建您的结构实例并附加它
files.append(FileInfo(url: fileURL, name: name, path: path, date: date)
排序现在变得很简单,所以在 for 循环之后你就可以了
files.sort(by: { [=13=].date < .date })
这个是升序排列的,不知道你要哪个。