Get directory contents in date modified order

后端 未结 5 1997
盖世英雄少女心
盖世英雄少女心 2020-12-04 14:19

Is there an method to get the contents of a folder in a particular order? I\'d like an array of file attribute dictionaries (or just file names) ordered by date modified.

相关标签:
5条回答
  • 2020-12-04 14:59

    nall's code above pointed me in the right direction, but I think there are some mistakes in the code as posted above. For instance:

    1. Why is filesAndProperties allocated using NMutableDictonary rather than an NSMutableArray?

    2. 
      NSDictionary* properties = [[NSFileManager defaultManager]
                                              attributesOfItemAtPath:NSFileModificationDate
                                              error:&error];
      
      
      The code above is passing the wrong parameter for attributesOfItemAtPath - it should be attributesOfItemAtPath:path

    3. Your are sorting the files array, but you should be sorting filesAndProperties.


    I have implemented the same, with corrections, and using blocks and posted below:

    
        NSArray *searchPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        NSString* documentsPath = [searchPaths objectAtIndex: 0]; 
    
        NSError* error = nil;
        NSArray* filesArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsPath error:&error];
        if(error != nil) {
            NSLog(@"Error in reading files: %@", [error localizedDescription]);
            return;
        }
    
        // sort by creation date
        NSMutableArray* filesAndProperties = [NSMutableArray arrayWithCapacity:[filesArray count]];
        for(NSString* file in filesArray) {
            NSString* filePath = [iMgr.documentsPath stringByAppendingPathComponent:file];
            NSDictionary* properties = [[NSFileManager defaultManager]
                                        attributesOfItemAtPath:filePath
                                        error:&error];
            NSDate* modDate = [properties objectForKey:NSFileModificationDate];
    
            if(error == nil)
            {
                [filesAndProperties addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                               file, @"path",
                                               modDate, @"lastModDate",
                                               nil]];                 
            }
        }
    
            // sort using a block
            // order inverted as we want latest date first
        NSArray* sortedFiles = [filesAndProperties sortedArrayUsingComparator:
                                ^(id path1, id path2)
                                {                               
                                    // compare 
                                    NSComparisonResult comp = [[path1 objectForKey:@"lastModDate"] compare:
                                                               [path2 objectForKey:@"lastModDate"]];
                                    // invert ordering
                                    if (comp == NSOrderedDescending) {
                                        comp = NSOrderedAscending;
                                    }
                                    else if(comp == NSOrderedAscending){
                                        comp = NSOrderedDescending;
                                    }
                                    return comp;                                
                                }];
    
    
    0 讨论(0)
  • 2020-12-04 15:14

    Code does not work in iPhone SDK, full of compilation error. Please find updated code `

    NSInteger lastModifiedSort(id path1, id path2, void* context)
    {
        int comp = [[path1 objectForKey:@"lastModDate"] compare:
         [path2 objectForKey:@"lastModDate"]];
        return comp;
    }
    
    -(NSArray *)filesByModDate:(NSString*) path{
    
        NSError* error = nil;
    
        NSArray* filesArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path
                                                                             error:&error];
        if(error == nil)
        {
            NSMutableArray* filesAndProperties = [NSMutableArray arrayWithCapacity:[filesArray count]];
    
            for(NSString* imgName in filesArray)
            {
    
                NSString *imgPath = [NSString stringWithFormat:@"%@/%@",path,imgName];
                NSDictionary* properties = [[NSFileManager defaultManager]
                                            attributesOfItemAtPath:imgPath
                                            error:&error];
    
                NSDate* modDate = [properties objectForKey:NSFileModificationDate];
    
                if(error == nil)
                {
                    [filesAndProperties addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                                   imgName, @"path",
                                                   modDate, @"lastModDate",
                                                   nil]];                     
                }else{
                    NSLog(@"%@",[error description]);
                }
            }
            NSArray* sortedFiles = [filesAndProperties sortedArrayUsingFunction:&lastModifiedSort context:nil];
    
            NSLog(@"sortedFiles: %@", sortedFiles);      
            return sortedFiles;
        }
        else
        {
            NSLog(@"Encountered error while accessing contents of %@: %@", path, error);
        }
    
        return filesArray;
    }
    

    `

    0 讨论(0)
  • 2020-12-04 15:19

    It's too slow

    [[NSFileManager defaultManager]
                                    attributesOfItemAtPath:NSFileModificationDate
                                    error:&error];
    

    Try this code:

    + (NSDate*) getModificationDateForFileAtPath:(NSString*)path {
        struct tm* date; // create a time structure
        struct stat attrib; // create a file attribute structure
    
        stat([path UTF8String], &attrib);   // get the attributes of afile.txt
    
        date = gmtime(&(attrib.st_mtime));  // Get the last modified time and put it into the time structure
    
        NSDateComponents *comps = [[NSDateComponents alloc] init];
        [comps setSecond:   date->tm_sec];
        [comps setMinute:   date->tm_min];
        [comps setHour:     date->tm_hour];
        [comps setDay:      date->tm_mday];
        [comps setMonth:    date->tm_mon + 1];
        [comps setYear:     date->tm_year + 1900];
    
        NSCalendar *cal = [NSCalendar currentCalendar];
        NSDate *modificationDate = [[cal dateFromComponents:comps] addTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMT]];
    
        [comps release];
    
        return modificationDate;
    }
    
    0 讨论(0)
  • 2020-12-04 15:20

    How about this:

    // Application documents directory
    NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    
    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:documentsURL
                                                              includingPropertiesForKeys:@[NSURLContentModificationDateKey]
                                                                                 options:NSDirectoryEnumerationSkipsHiddenFiles
                                                                                   error:nil];
    
    NSArray *sortedContent = [directoryContent sortedArrayUsingComparator:
                            ^(NSURL *file1, NSURL *file2)
                            {
                                // compare
                                NSDate *file1Date;
                                [file1 getResourceValue:&file1Date forKey:NSURLContentModificationDateKey error:nil];
    
                                NSDate *file2Date;
                                [file2 getResourceValue:&file2Date forKey:NSURLContentModificationDateKey error:nil];
    
                                // Ascending:
                                return [file1Date compare: file2Date];
                                // Descending:
                                //return [file2Date compare: file1Date];
                            }];
    
    0 讨论(0)
  • 2020-12-04 15:24

    Simpler...

    NSArray*  filelist_sorted;
    filelist_sorted = [filelist_raw sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSDictionary* first_properties  = [[NSFileManager defaultManager] attributesOfItemAtPath:[NSString stringWithFormat:@"%@/%@", path_thumb, obj1] error:nil];
        NSDate*       first             = [first_properties  objectForKey:NSFileModificationDate];
        NSDictionary* second_properties = [[NSFileManager defaultManager] attributesOfItemAtPath:[NSString stringWithFormat:@"%@/%@", path_thumb, obj2] error:nil];
        NSDate*       second            = [second_properties objectForKey:NSFileModificationDate];
        return [second compare:first];
    }];
    
    0 讨论(0)
提交回复
热议问题