#ios #arrays #cocoa-touch #home-directory
#iOS #массивы #cocoa-touch #домашний каталог
Вопрос:
В моем приложении я сохраняю некоторое изображение в NSHomeDirectory таким образом:
NSString *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:[@"Documents/" stringByAppendingString:fileName]];
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];
Я хочу переименовать эти файлы при удалении одного из них
пример:
У меня есть в этом каталоге
Фото1-Фото2-Фото3 если я удалю фото 2, я хочу переименовать Фото3 в фото 2
Как я могу это сделать?
Ответ №1:
Основываясь на примере, вы, похоже, пытаетесь сохранить порядок фотографий. Хотя вы могли бы попробовать перечислить каталог и проверить, какие файлы необходимо изменить, а затем изменить их, вероятно, было бы намного проще поддерживать индекс изображений с помощью plist и считывать из него объект изменяемого массива и удалять индексы, которые необходимо удалить, и соответствующие им изображения. Порядок будет сохранен после удаления.
Ответ №2:
Вы бы использовали moveItemAtPath:toPath:error:
метод NSFileManager
, подобный этому:
NSString *jpgPathOne = [NSHomeDirectory() stringByAppendingPathComponent:[@"Documents/" stringByAppendingString:@"Photo1.jpg"]];
NSString *jpgPathTwo = [NSHomeDirectory() stringByAppendingPathComponent:[@"Documents/" stringByAppendingString:@"Photo2.jpg"]];
NSString *jpgPathThree = [NSHomeDirectory() stringByAppendingPathComponent:[@"Documents/" stringByAppendingString:@"Photo3.jpg"]];
NSFileManager *localFileManager = [[NSFileManager alloc] init];
// ... delete Photo2
NSError *deleteError = nil;
BOOL deleted = [localFileManager removeItemAtPath:jpgPathTwo error:amp;deleteError];
if (!deleted || deleteError) {
NSLog(@"ERROR Deleting file: %@n%@ - %@", jpgPathTwo, [deleteError localizedDescription], [deleteError localizedFailureReason]);
} else {
// ... If delete worked, rename Photo3 to Photo2...
NSError *renameError = nil;
BOOL renamed = [localFileManager moveItemAtPath:jpgPathThree toPath:jpgPathTwo error:amp;renameError];
if (!renamed || renameError) {
NSLog(@"ERROR Moving file: %@ to %@!n%@ - %@", jpgPathThree, jpgPathTwo, [renameError localizedDescription], [renameError localizedFailureReason]);
}
}
[localFileManager release];
Это непроверено, но должно работать:
- (BOOL)deleteAndRename:(NSString *)filePath {
BOOL success = NO;
NSError *error = nil;
NSFileManager *fileManager = [[NSFileManager alloc] init];
if ([fileManager fileExistsAtPath:filePath]) {
success = [fileManager removeItemAtPath:filePath error:amp;error];
if (success) {
error = nil;
NSString *prevFilePath = filePath;
NSString *photoNumber = [[filePath stringByDeletingPathExtension] stringByReplacingOccurrencesOfString:@"Photo" withString:@""];
NSString *nextSequentialFile = [filePath stringByReplacingOccurrencesOfString:photoNumber withString:[NSString stringWithFormat:@"%d", ([photoNumber intValue] 1)] options:NSBackwardsSearch range:NSRangeFromString(filePath)];
BOOL moveSuccess = NO;
while ([fileManager fileExistsAtPath:nextSequentialFile]) {
moveSuccess = [fileManager moveItemAtPath:nextSequentialFile toPath:prevFilePath error:amp;error];
if (moveSuccess) {
prevFilePath = nextSequentialFile;
photoNumber = [[prevFilePath stringByDeletingPathExtension] stringByReplacingOccurrencesOfString:@"Photo" withString:@""];
nextSequentialFile = [prevFilePath stringByReplacingOccurrencesOfString:photoNumber withString:[NSString stringWithFormat:@"%d", ([photoNumber intValue] 1)] options:NSBackwardsSearch range:NSRangeFromString(prevFilePath)];
} else {
NSLog(@"*** Error Moving File: %@ -> %@ ***", nextSequentialFile, filePath);
if (error) {
NSLog(@"%@ - %@", [error localizedDescription], [error localizedFailureReason]);
}
success = NO;
break;
}
}
success = moveSuccess;
} else {
NSLog(@"*** Error Deleting File: %@ ***", filePath);
if (error) {
NSLog(@"%@ - %@", [error localizedDescription], [error localizedFailureReason]);
}
}
} else {
NSLog(@"*** No such file: %@ ***", filePath);
success = NO;
}
return success;
}
Комментарии:
1. все в порядке, но это только для трех фотографий, но для динамической ситуации?
2. существует проблема; если у меня есть Фото1 Фото2 Фото3 Фото4 Фото5 и я удаляю Фото2, он переименовывает Phot3 в Photo2, но Photo4 и Photo5? они также должны изменить имена.
3. У меня проблема здесь: NSString nextSequentialFile = [Путь к файлу stringByReplacingOccurrencesOfString:photoNumber withString:[NSString stringWithFormat:@»%d», ([photoNumber intValue] 1)] параметры: NSBackwardsSearch диапазон:[filePath rangeOfString:Параметры photoNumber:NSBackwardsSearch]]; // в нем говорится, что завершение работы приложения из-за чтобы не пойманныйисключение ‘NSRangeException’, причина: ‘** -[NSCFString replaceOccurrencesOfString:withString:параметры: диапазон:]: Диапазон или индекс вне границ’