FileManager.default.contentsOfDirectory возвращает массив с различной сортировкой в ​​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"

В обоих случаях результаты одинаковы, но сортировка различна. Может ли кто-нибудь помочь мне об этом.

Заранее спасибо.

2 ответа

Решение

NSFileManager не сортирует список файлов. Но вы можете сделать это самостоятельно, используя sorted метод array, Код будет выглядеть так:

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 { $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 }
Другие вопросы по тегам