Iterating through files in a folder with nested folders - Cocoa

后端 未结 6 2070
迷失自我
迷失自我 2020-12-07 10:52

I need to access every file in a folder, including file that exist within nested folders. An example folder might look like this.

animals/
 -k.txt
 -d.jpg
 c         


        
相关标签:
6条回答
  • 2020-12-07 10:57

    Here is a swift version:

    func openEachFile(inDirectory path: String) {
        let subs = try! FileManager.default.subpathsOfDirectory(atPath: path)
        let totalFiles = subs.count
        print(totalFiles)
        for sub in subs {
            if sub.hasSuffix(".DS_Store") {
                //a DS_Store file
            }
            else if sub.hasSuffix(".xcassets") {
                //a xcassets file
            }
            else if (sub as NSString).substring(to: 4) == ".git" {
                //a git file
            }
            else if sub.hasSuffix(".swift") {
                //a swift file
            }
            else if sub.hasSuffix(".m") {
                //a objc file
            }
            else if sub.hasSuffix(".h") {
                //a header file
            }
            else {
                // some other file
            }
            let fullPath = (path as NSString).appendingPathComponent(sub)
        }
    }
    
    0 讨论(0)
  • 2020-12-07 10:59

    Here's a solution using -subpathsOfDirectoryAtPath:rootPath, with file URLs and modern Objective-C nullability bells & whistles.

    typedef void (^FileEnumerationBlock)(NSURL *_Nonnull fileURL);
    
    @interface NSFileManager (Extensions)
    
    - (void)enumerateWithRootDirectoryURL:(nonnull NSURL *)rootURL
                              fileHandler:(FileEnumerationBlock _Nonnull)fileHandler
                                    error:(NSError *_Nullable *_Nullable)error;
    
    @end
    
    @implementation NSFileManager (Extensions)
    
    - (void)enumerateWithRootDirectoryURL:(NSURL *)rootURL
                              fileHandler:(FileEnumerationBlock)fileHandler
                                    error:(NSError **)error {
        NSString *rootPath = rootURL.path;
        NSAssert(rootPath != nil, @"Invalid root URL %@ (nil path)", rootURL);
    
        NSArray *subs = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:rootPath
                                                                            error:error];
    
        if (!subs) {
            return;
        }
    
        for (NSString *sub in subs) {
            fileHandler([rootURL URLByAppendingPathComponent:sub]);
        }
    }
    
    @end
    

    … and the same in Swift:

    func enumerate(rootDirectoryURL rootURL: NSURL, fileHandler:(URL:NSURL)->Void) throws {
        guard let rootPath = rootURL.path else {
            preconditionFailure("Invalid root URL: \(rootURL)")
        }
    
        let subs = try NSFileManager.defaultManager().subpathsOfDirectoryAtPath(rootPath)
        for sub in subs {
            fileHandler(URL: rootURL.URLByAppendingPathComponent(sub))
        }
    }
    
    0 讨论(0)
  • 2020-12-07 11:01

    In Swift we can try the following.

    let docsDir = NSHomeDirectory().appending("/Documents")
    let localFileManager = FileManager()
    
    let dirEnum = localFileManager.enumerator(atPath: docsDir)
    
    while let file = dirEnum?.nextObject() as? String {
        if file.hasSuffix(".doc") {
            print(docsDir.appending("/\(file)"))
        }
    }
    

    Reference https://developer.apple.com/documentation/foundation/filemanager/1408726-enumerator

    0 讨论(0)
  • 2020-12-07 11:03

    Maybe you can use something like this:

    +(void)openEachFileAt:(NSString*)path
    {
      NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path];
      for (NSString * file in enumerator)
      {
         // check if it's a directory
         BOOL isDirectory = NO;
        NSString* fullPath = [path stringByAppendingPathComponent:file];
        [[NSFileManager defaultManager] fileExistsAtPath:fullPath
                                             isDirectory: &isDirectory];
        if (!isDirectory)
        {
          // open your file (fullPath)…
        }
        else
        {
          [self openEachFileAt: fullPath];
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-07 11:15

    Use NSDirectoryEnumerator to recursively enumerate files and directories under the directory you want, and ask it to tell you whether it is a file or directory. The following is based on the example listed at the documentation for -[NSFileManager enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:]:

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *directoryURL = … // URL pointing to the directory you want to browse
    NSArray *keys = [NSArray arrayWithObject:NSURLIsDirectoryKey];
    
    NSDirectoryEnumerator *enumerator = [fileManager
        enumeratorAtURL:directoryURL
        includingPropertiesForKeys:keys
        options:0
        errorHandler:^BOOL(NSURL *url, NSError *error) {
            // Handle the error.
            // Return YES if the enumeration should continue after the error.
            return YES;
    }];
    
    for (NSURL *url in enumerator) { 
        NSError *error;
        NSNumber *isDirectory = nil;
        if (! [url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) {
            // handle error
        }
        else if (! [isDirectory boolValue]) {
            // No error and it’s not a directory; do something with the file
        }
    }
    
    0 讨论(0)
  • 2020-12-07 11:15

    This code worked for me.

    NSMutableString *allHash;  
    
      -(NSString*)getIterate:(NSString*)path {
    
            allHash = [NSMutableString stringWithString:@""];
    
            NSDirectoryEnumerator *de= [[NSFileManager defaultManager] enumeratorAtPath:path];
            NSString *file;
            BOOL isDirectory;
    
            for(file in de)
            {
    
                //first check if it's a file
                NSString* fullPath = [NSString stringWithFormat:@"%@/%@",path,file];
    
                BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDirectory];
                NSLog(@"Check=>%d",fileExistsAtPath);
    
                if (!isDirectory) //its a file
                {
                    //Do with filepath
                }
                else{ //it's a folder, so recurse
                    [self enumerateFolder:fullPath];
                }
            }
    
            return allHash;
    
    
        }
    
        -(void) enumerateFolder:(NSString*)fileName
        {
    
            NSDirectoryEnumerator *de= [[NSFileManager defaultManager] enumeratorAtPath:fileName];
            NSString* file;
            BOOL isDirectory;
    
            for(file in de)
            {
                //first check if it's a file
                BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:file isDirectory:&isDirectory];
    
                if (fileExistsAtPath) {
                    if (!isDirectory) //its a file
                    { 
                      //Do with file  
                    }
                    else{ //it's a folder, so recurse
    
                        [self enumerateFolder:file];
                    }
                }
                else printf("\nenumeratefolder No file at path %s",[file UTF8String]);
            }
        }
    
    0 讨论(0)
提交回复
热议问题