Изменить имя файла в NSHomeDirectory

#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:параметры: диапазон:]: Диапазон или индекс вне границ’