Utilicé NSFileManager para recuperar los archivos en una carpeta y quiero ordenarlos por fecha de modificación. Como hacer eso ?Cómo ordenar archivos por fecha de modificación en iOS
Gracias.
Utilicé NSFileManager para recuperar los archivos en una carpeta y quiero ordenarlos por fecha de modificación. Como hacer eso ?Cómo ordenar archivos por fecha de modificación en iOS
Gracias.
¿Qué ha intentado hasta ahora?
no he hecho esto, pero un rápido vistazo a los documentos me hace pensar que usted debe tratar lo siguiente:
-contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:
y especificar NSURLContentModificationDateKey
como una de las claves.-sortedArrayUsingComparator:
.-getResourceValue:forKey:error:
.Actualización: Cuando escribí la respuesta anterior, -getResourceValue:forKey:error:
existía en iOS, pero no hizo nada. Ese método es ahora funcional como de iOS 5. El siguiente código registrará los archivos de recursos de una aplicación seguido de una lista de fechas de modificación correspondientes:
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *files = [manager contentsOfDirectoryAtURL:[[NSBundle mainBundle] resourceURL]
includingPropertiesForKeys:[NSArray arrayWithObject:NSURLContentModificationDateKey]
options:nil
error:nil];
NSMutableArray *dates = [NSMutableArray array];
for (NSURL *f in files) {
NSDate *d = nil;
if ([f getResourceValue:&d forKey:NSURLContentModificationDateKey error:nil]) {
[dates addObject:d];
}
}
NSLog(@"Files: %@", files);
NSLog(@"Dates: %@", dates);
static static NSInteger contentsOfDirSort(NSString *left, NSString *right, void *ptr) {
(void)ptr;
struct stat finfo_l, r_finfo_r;
if(-1 == stat([left UTF8String], &finfo_l))
return NSOrderedSame;
if(-1 == stat([right UTF8String], &finfo_r))
return NSOrderedSame;
if(finfo_l.st_mtime < finfo_r.st_mtime)
return NSOrderedAscending;
if(finfo_l.st_mtime > finfo_r.st_mtime)
return NSOrderedDescending;
return NSOrderedSame;
}
Ahora, más adelante en el código.
NSMutableArray *mary = [NSMutableArray arrayWithArray:filePathsArray];
[mary sortUsingFunction:contentsOfDirSort context:nil];
// Use mary...
En una categoría más NSFileManager
:
static NSInteger contentsOfDirSort(NSURL *leftURL, NSURL *rightURL, void *ptr)
{
(void)ptr;
NSDate * dateLeft ;
[leftURL getResourceValue:&dateLeft
forKey:NSURLContentModificationDateKey
error:nil] ;
NSDate * dateRight ;
[leftURL getResourceValue:&dateRight
forKey:NSURLContentModificationDateKey
error:nil] ;
return [dateLeft compare:dateRight];
}
- (NSArray *)contentsOrderedByDateOfDirectoryAtPath:(NSURL *)URLOfFolder ;
{
NSArray *files = [self contentsOfDirectoryAtURL:URLOfFolder
includingPropertiesForKeys:[NSArray arrayWithObject:NSURLContentModificationDateKey]
options:0
error:nil];
return [files sortedArrayUsingFunction:contentsOfDirSort
context:nil] ;
}
método rápido:
-(void)dateModified
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];
//--- Listing file by name sort
NSLog(@"\n File list %@",fileList);
int num;
//-- Listing file name with modified dated
for (NSString *s in fileList)
{
NSString *filestring = [documentsDirectory stringByAppendingFormat:@"/%@",s];
NSDictionary *filePathsArray1 = [[NSFileManager defaultManager] attributesOfItemAtPath:filestring error:nil];
NSString *modifiedDate = [filePathsArray1 objectForKey:NSFileModificationDate];
NSLog(@"\n Modified Day : %@", modifiedDate);
num=num+1;
}
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *imageFilenames = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];
NSMutableArray *originalImage = [[NSMutableArray alloc]init];
for (int i = 1; i < [imageFilenames count]; i++)
{
NSString *imageName = [NSString stringWithFormat:@"%@/%@",documentsDirectory,[imageFilenames objectAtIndex:i] ];
}
//---------sorting image by date modified
NSArray* filelist_date_sorted;
filelist_date_sorted = [imageFilenames sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
NSDictionary* first_properties = [[NSFileManager defaultManager] attributesOfItemAtPath:[NSString stringWithFormat:@"%@/%@", documentsDirectory, obj1] error:nil];
NSDate *first = [first_properties objectForKey:NSFileCreationDate];
NSDictionary *second_properties = [[NSFileManager defaultManager] attributesOfItemAtPath:[NSString stringWithFormat:@"%@/%@", documentsDirectory, obj2] error:nil];
NSDate *second = [second_properties objectForKey:NSFileCreationDate];
return [second compare:first];
}];
NSLog(@" Date sorted result is %@",filelist_date_sorted);
Curiosamente, la documentación para getResourceValue: forKey: Error: dicen "Este método se IMPLEMENTAR EN iOS, por lo que no realiza ninguna operación ". Justo debajo, dicen "Disponible en iOS 4.0 y versiones posteriores". El por qué agregarían un método que no se implementa es confuso. ? = | Más: http://www.themusingsofalostprogrammer.com/2011/06/what-were-they-thinking-apple.html – Dustin
El marco de Foundation es común para MacOS X e iOS, por lo que puede estar allí simplemente porque es útil en MacOS X. Por otro lado, puede que valga la pena intentarlo con la esperanza de que la documentación sea incorrecta; sucede de vez en cuando. – Caleb
@Dustin, tenga en cuenta que los documentos ahora indican que 'getResourceValue: forKey: error:' es funcional en iOS 5. Hice una prueba rápida y confirmé que funciona. Actualizaré la respuesta anterior también. – Caleb