34 votes

Obtenir le contenu du répertoire dans l'ordre de modification de la date

Y a t il une méthode pour obtenir le contenu d'un dossier dans un ordre particulier? Je voudrais un tableau de l'attribut de fichier dictionnaires (ou tout simplement les noms de fichiers) commandé par date de modification.

Maintenant, je suis en train de faire de cette façon:

  • obtenir un tableau avec les noms de fichier
  • obtenir les attributs de chaque fichier
  • stocker le chemin d'accès du fichier et la date de modification dans un dictionnaire avec la date comme l'un des principaux

Ensuite j'ai de la sortie du dictionnaire dans l'ordre de date, mais je me demandais si il ya un moyen plus facile? Si non, est-il un extrait de code quelque part qui va le faire pour moi?

Merci.

35voto

M-V Points 1801

nall du code ci-dessus m'a orienté dans la bonne direction, mais je pense qu'il y a quelques erreurs dans le code affiché ci-dessus. Par exemple:

  1. Pourquoi est - filesAndProperties allouée à l'aide d' NMutableDictonary plutôt qu'un NSMutableArray?
  2. 
    NSDictionary* properties = [[NSFileManager defaultManager]
                                            attributesOfItemAtPath:NSFileModificationDate
                                            error:&error];
    
    
    Le code ci-dessus est de passer les mauvais paramètre attributesOfItemAtPath - , il devrait être attributesOfItemAtPath:path
  3. Votre sont de tri de l' files tableau, mais vous devriez être en tri filesAndProperties.


J'ai mis en œuvre la même, avec des corrections, et à l'aide de blocs et affiché ci-dessous:


    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;                                
                            }];

20voto

Ivan Kovacevic Points 613

Que dis-tu de ça:

 // 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];
                        }];
 

10voto

Mark Yang Points 67

Plus simple ...

 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];
}];
 

5voto

abuharsky Points 467

C'est trop lent

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

Essayez ce 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;
}
 

0voto

nall Points 10996

Le code ne fonctionne pas dans le SDK iPhone, plein d'erreur de compilation. Veuillez trouver le code mis à jour `

 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;
}
 

"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X