Как перечислить все папки и их подкаталоги/файлы в iPhone SDK?

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

Ответ 1

Учтите, что ваше приложение работает в изолированной программной среде и не сможет получить какую-либо папку/файл за пределами этой изолированной программы.

ObjectiveC

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];

NSFileManager *manager = [NSFileManager defaultManager];
NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];
for (NSString *s in fileList){
    NSLog(@"%@", s);
}

Swift 4

guard let documentsDirectory =  try? FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) else { return }
guard let fileEnumerator = FileManager.default.enumerator(at: documentsDirectory, includingPropertiesForKeys: nil, options: FileManager.DirectoryEnumerationOptions()) else { return }
while let file = fileEnumerator.nextObject() {
    print(file)
}

Ответ 2

Здесь самый медленный (?) подход:

NSFileManager * fileManager = [NSFileManager new];
NSArray * subpaths = [fileManager subpathsAtPath:path];

но это должно по крайней мере указывать на более специализированную реализацию для ваших нужд.

Несколько абстракции нижнего уровня, которые позволяют вам перечислять по запросу, включают NSDirectoryEnumerator и CFURLEnumerator. В зависимости от глубины каталога они могут сэкономить много ненужных взаимодействий с файловой системой по сравнению с -[NSFileManager subpathsAtPath:].

Ответ 3

Вы можете использовать NSDirectoryEnumerator через NSFileManager.enumeratorAtPath

Из документов:

NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:  @"Documents"];
NSFileManager *localFileManager=[[NSFileManager alloc] init];
NSDirectoryEnumerator *dirEnum =
    [localFileManager enumeratorAtPath:docsDir];

NSString *file;
while ((file = [dirEnum nextObject])) {
    if ([[file pathExtension] isEqualToString: @"doc"]) {
        // process the document
        [self scanDocument: [docsDir stringByAppendingPathComponent:file]];
    }
}

Ответ 4

swift 3

    let fileManager:FileManager = FileManager()
    let files = fileManager.enumerator(atPath: NSHomeDirectory())
    while let file = files?.nextObject() {
        print("Files::",file)
    }

Ответ 5

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

Вот некоторые из моих возможностей:

  • Возможность выбора файлов и/или каталогов, если есть необходимость в этом
  • По возможности для удаления файлов и/или каталогов, если есть необходимость в этом
  • Встроенная функция поиска
  • Просмотр файлов аудио, видео, изображений и PDF.
  • Возможность добавления поддержки для любого типа файла.

Вы можете найти мой элемент управления здесь.