FileManager.default.contentsOfDirectory return 在 iphone 8 中具有不同排序的数组

FileManager.default.contentsOfDirectory return array with different sorting in iphone 8

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

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"

在这两种情况下,结果相同但排序不同。谁能帮我一下。

提前致谢。

NSFileManager 不对文件列表进行排序。但是您可以使用 arraysorted 方法自己完成。代码将如下所示:

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

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

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 { [=11=].path < .path }
} catch {
    print("An error occurred: \(error)")
}

如果你想倒序排列,只需在闭包内改变顺序即可。

let files = try FileManager.default.contentsOfDirectory(at: targetDirectoryURL, includingPropertiesForKeys: nil, options: .skipsHiddenFiles).sorted { .path < [=12=].path }