Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get all URLs for resources in sub-directory in Swift

I am attempting to create an array of URLs for all of the resources in a sub-directory in my iOS app. I can not seem to get to the correct path, I want to be able to retrieve the URLs even if I do not know the names (i.e. I don't want to hard code the file names into the code).

Below is a screen shot of the hierarchy, I am attempting to get all the files in the 'test' folder: enter image description here

Any help is greatly appreciated, I have attempted to use file manager and bundle main path but to no joy so far.

This is the only code I have currently:

let fileManager = FileManager.default
let path = Bundle.main.urls(forResourcesWithExtension: "pdf", subdirectory: "Files/test")

print(path)

I have also tried this code but this prints all resources, I can't seem to specify a sub-directory:

let fm = FileManager.default
let path = Bundle.main.resourcePath!

do {
    let items = try fm.contentsOfDirectory(atPath: path)

    for item in items {
        print("Found \(item)")
    }
} catch {
    // failed to read directory – bad permissions, perhaps?
}

Based on an answer from @vadian , The folders were changed from virtual groups to real folders. Using the following code I was able to get a list of resources:

let fileManager = FileManager.default
    let path = Bundle.main.resourcePath

    let enumerator:FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: "\(path!)/Files/test")!
    while let element = enumerator.nextObject() as? String {
        if element.hasSuffix("pdf") || element.hasSuffix("jpg") { // checks the extension
            print(element)
        }
    }
like image 213
Dom Bryan Avatar asked Apr 24 '18 14:04

Dom Bryan


2 Answers

You can follow the following steps to get them:

  1. Create a new folder inside your project folder with the extension is .bundle (for example: Images.bundle).
  2. Copy resource files into that new folder.
  3. Drag that new folder into the project that opening in Xcode.
  4. Retrieve the URLs by using the following code snippet:

    let urls = Bundle.main.urls(forResourcesWithExtension: nil, subdirectory: "Images.bundle")
    

You can also view the guide video here: https://youtu.be/SpMaZp0ReEo

like image 148
Quang Tran Avatar answered Nov 03 '22 01:11

Quang Tran


Consider that the yellow folders enter image description here are virtual groups, not real folders (although Xcode creates real folders in the project directory). All files in the yellow folders are moved into the Resources directory in the bundle when the app is built.

Real folders in the bundle are enter image description here in the project navigator.

like image 18
vadian Avatar answered Nov 03 '22 00:11

vadian