Run NSBundle from the documents folder

前端 未结 2 1640
悲&欢浪女
悲&欢浪女 2020-12-22 11:33

Is there any way to use a NSBundle from the documents folder on iOS?

相关标签:
2条回答
  • 2020-12-22 12:08

    Not sure what the exact question is, either, but here is how I access the local document folder of my app (this is not the documents folder where you store sources your app uses, but the one your app stores local resources) for example, in my app I take pics with the camera and store them to the app's local folder, not the device camera roll, so to get the number of images I do this, in the viewWillAppear method use:

    // create the route of localDocumentsFolder
    NSArray *filePaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //first use the local documents folder
    NSString *docsPath = [NSString stringWithFormat:@"%@/Documents", NSHomeDirectory()];
    //then use its bundle, indicating its path
    NSString *bundleRoot = [[NSBundle bundleWithPath:docsPath] bundlePath];
    //then get its content
    NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bundleRoot error:nil];
    // this counts the total of jpg images contained in the local document folder of the app
    NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.JPG'"]];
    // in console tell me how many jpg do I have
    NSLog(@"numero de fotos en total: %i", [onlyJPGs count]);
    // ---------------
    

    if you want to know what is in the documents folder (the one you can actually browse in the iOS Simulator

    via ~/YourUserName/Library/Application Support/iPhone Simulator/versioOfSimulator/Applications/appFolder/Documents)

    you would use NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; instead.

    Hope it helps you, mate!

    0 讨论(0)
  • 2020-12-22 12:16

    I'm not entirely sure what you're getting at, but the general approach as far as using a file from your application's bundle is to copy it into the document directory as follows:

    1. Check (on first launch, startup or as required) for the presence of the file in your document directory.

    2. If it's not present, copy the "install" version of the file from your bundle into the document directory.

    In terms of some sample code, I've a method I use for such purposes as follows:

    - (BOOL)copyFromBundle:(NSString *)fileName {
    
        BOOL copySucceeded = NO;
    
        // Get our document path.
        NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentPath = [searchPaths objectAtIndex:0];
    
        // Get the full path to our file.
        NSString *filePath = [documentPath stringByAppendingPathComponent:fileName];
    
        NSLog(@"copyFromBundle - checking for presence of \"%@\"...", fileName);
    
        // Get a file manager
        NSFileManager *fileManager = [NSFileManager defaultManager];
    
        // Does the database already exist? (If not, copy it from our bundle)
        if(![fileManager fileExistsAtPath:filePath]) {
    
            // Get the bundle location
            NSString *bundleDBPath = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
    
            // Copy the DB to our document directory.
            copySucceeded = [fileManager copyItemAtPath:bundleDBPath
                                                 toPath:filePath
                                                  error:nil];
    
            if(!copySucceeded) {
                NSLog(@"copyFromBundle - Unable to copy \"%@\" to document directory.", fileName);
            }
            else {
                NSLog(@"copyFromBundle - Succesfully copied \"%@\" to document directory.", fileName);
            }
    
        }
        else {
            NSLog(@"copyFromBundle - \"%@\" already exists in document directory - ignoring.", fileName);   
        }
    
        return copySucceeded;
    }
    

    This will check for the presence of the named file in your document directory and copy the file from your bundle if it doesn't already exist.

    0 讨论(0)
提交回复
热议问题