-2

我正在尝试使用以下方法获取目录的内容。

let files: [String]? = try? FileManager.default.contentsOfDirectory(atPath: self.targetDirectory)

它在所有设备上都运行良好,但在 iPhone 8 的情况下,我得到了不同排序的结果。

例如,在 iPhone 7+ 的情况下,我得到以下结果。

Printing description of filterFiles:
▿ Optional<Array<String>>
  ▿ some : 2 elements
    - 0 : "0.m4a"
    - 1 : "1.m4a"

但在 iPhone 8 的情况下,我得到以下结果:

Printing description of files:
▿ Optional<Array<String>>
  ▿ some : 2 elements
    - 0 : "1.m4a"
    - 1 : "0.m4a"

在这两种情况下,结果相同,但排序不同。任何人都可以帮我解决这个问题。

提前致谢。

4

2 回答 2

4

NSFileManager不对文件列表进行排序。但是您可以sorted使用array. 代码将如下所示:

let files: [String]? = try? FileManager.default.contentsOfDirectory(atPath: self.targetDirectory)
let sortedFiles = files?.sorted()
于 2017-11-10T13:06:43.420 回答
0

为了回答最初的问题,我建议将不可变属性文件更改为可变属性:

var files: [String]? = try? FileManager.default.contentsOfDirectory(atPath: self.targetDirectory)

if files != nil {
    files = files?.sorted()
}

使用 Swift 5.5 回答:

如果您只是按文件名查找系统默认排序文件列表,则可以将以下内容与 URL 一起使用。atPath 没有排序方法:在 FileManager 中调用。使用此方法可提供要使用的 URL 列表。如果需要完整路径,可以使用 file[#].path 方法获取列表项的路径。

let targetDirectoryURL = URL(fileURLWithPath: self.targetDirectory)

do {
    let files = try FileManager.default.contentsOfDirectory(at: targetDirectoryURL), includingPropertiesForKeys: nil, options: .skipsHiddenFiles).sorted { $0.path < $1.path }
} catch {
    print("An error occurred: \(error)")
}

如果您希望它以相反的顺序排序,只需更改闭包内的顺序即可。

let files = try FileManager.default.contentsOfDirectory(at: targetDirectoryURL, includingPropertiesForKeys: nil, options: .skipsHiddenFiles).sorted { $1.path < $0.path }
于 2022-01-24T06:23:30.643 回答