как получить полный путь к файлу с помощью swift в папке - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь рекурсивно получить пути ко всем файлам, чтобы я мог их обработать, я уверен, что это тривиально для многих, но я все еще новичок в стремительности, пожалуйста, потерпите меня.

let enumerator = FileManager.default.enumerator(atPath: arguments.get(fileName)![0])

while let element = enumerator?.nextObject() as? String {
         print(element)
    }

вышекод только дает список имен файлов без реальных полных путей

file1.txt
file2.txt 
file3.txt

структура

-- folder1
    --file1.txt
    --file2.txt
    -- folder2
       --file3.txt

, но file3.txt на самом деле находится в folder1 / folder2

какя получаю что-то подобное со swift?

/full/path/folder1/file1.txt
/full/path/folder1/file2.txt
/full/path/folder1/folder2/file3.txt

спасибо

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Вы можете получить свойство NSEnumerator allObjects, привести их от [Any] к [URL] и использовать compactMap, чтобы вернуть все URL-адреса файлов, которые не являются каталогами и не скрыты:

let documentsDir =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

// check if the url is a directory
if documentsDir.hasDirectoryPath {
    // get all non directory paths from your enumerator
    let contents = (FileManager.default.enumerator(at: documentsDir, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)?.allObjects as? [URL])?.lazy.compactMap {
        $0.hasDirectoryPath ? nil : $0.path
    } ?? []
    print(contents.count)
}
0 голосов
/ 17 октября 2019

Предположим, fm - наш файловый менеджер, а url - наш каталог URL.

let dir = fm.enumerator(at:url, includingPropertiesForKeys: nil)! 
for case let f as URL in dir {
    print(f) // or its absolute path or whatever
}

Вот тест:

let fm = FileManager.default
let docs = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
let f1 = docs.appendingPathComponent("f1.txt")
try? "howdy".write(to: f1, atomically: true, encoding: .utf8)
let subdir = docs.appendingPathComponent("subdir")
try? fm.createDirectory(at: subdir, withIntermediateDirectories: true, attributes: nil)
let f2 = subdir.appendingPathComponent("f2.txt")
try? "hello".write(to: f2, atomically: true, encoding: .utf8)

let dir = fm.enumerator(at:docs, includingPropertiesForKeys: nil)!
for case let f as URL in dir where f.pathExtension == "txt" {
    print(f) // or its absolute path or whatever
}

Результат:

file:///.../Documents/f1.txt
file:///.../Documents/subdir/f2.txt

Я считаю, что соответствует вашим требованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...