Я сумасшедший? Помогите с NSFileManager метод делегата shouldProceedAfterError в 10.5+ - PullRequest
4 голосов
/ 20 января 2010

Так что я вроде Какао n00b, но я пишу эту простую небольшую программу и не могу запустить метод делегата NSFileManager "shouldProceedAfterError ..." для запуска. Вот код, который я запускаю в моем AppDelegate

-(BOOL)copyFile {
    [[NSFileManager defaultManager] setDelegate:self];

    NSError *copyError = nil;
    NSString *filename = [[NSString alloc] initWithString:[[[self.sourceFile path] componentsSeparatedByString:@"/"] lastObject]];
    NSString *destination = [[[[[UserData sharedData] folderLocation] path] stringByAppendingString:@"/"] stringByAppendingString:filename];

    [[NSFileManager defaultManager] copyItemAtPath:[self.sourceFile path] toPath:destination error:&copyError];

    NSLog(@"error! %@",copyError);

    [filename release];
    return YES;
}

- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error copyingItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath {
    NSLog(@"more error... %@",error);
    return NO;
}
- (BOOL)fileManager:(NSFileManager *)fileManager shouldCopyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath {
    NSLog(@"in shouldCopyItemAtPath...");
    return YES;
}

Ситуация, с которой я пытаюсь разобраться, это если файл уже существует в месте назначения. Я получаю сообщение об ошибке, но никогда не получаю эту «дополнительную ошибку ...» для вывода. Я также получаю эту трассировку от shouldCopyItemAtPath: так что я не совсем уверен, почему метод не запускается?

Я схожу с ума, как я испортил реализацию делегата здесь? Спасибо за любую помощь!

Ответы [ 2 ]

5 голосов
/ 20 января 2010

Это всего лишь гипотеза, но поскольку copyItemAtPath: toPath: error определено так, что "Файл, указанный в srcPath, должен существовать, в то время как dstPath не должен существовать до операции." , возможно, сценарийгде dstPath уже существует, не считается «ошибкой» и поэтому не вызывает делегата.

т.е., возможно, «Это не ошибка, если вы делаете то, что мы сказали вам не делать».

Вы всегда можете выполнить проверку и удалить ее самостоятельно:

NSFileManager* fileManager = [NSFileManager defaultManager];

// Delete the file if it already exists.
if ([fileManager fileExistsAtPath: destination])
        if (![fileManager removeItemAtPath: destination error: error])
                return NO;

return [fileManager copyItemAtPath: source toPath: destination error: error];
1 голос
/ 20 января 2010

Возможно, вы указали неверный путь в качестве источника?
copyItemAtPath не вызывает методы делегата, если исходный путь неверен.
Вы можете проверить это, если используете следующий метод:

-(IBAction)copyFile:(id)sender
{
    [[NSFileManager defaultManager] setDelegate:self];
    NSError* copyError = nil;
    NSString* sourceFilepath = [@"~/Desktop/source.txt" stringByExpandingTildeInPath];
    NSString* targetFilepath = [@"~/Desktop/target.txt" stringByExpandingTildeInPath];  
    [[NSFileManager defaultManager] copyItemAtPath:sourceFilepath toPath:targetFilepath error:&copyError];  
    NSLog(@"Error:%@", copyError);  
}

При вызове этого метода я замечаю следующее поведение:

  • Если ~ / Desktop / source.txt является файлом и ~ / Desktop / target.txt не существует:
    • NSFileManager вызывает shouldCopyItemAtPath метод делегата
  • Если ~ / Desktop / source.txt является файлом и ~ / Desktop / target.txt существует:
    • NSFileManager сначала вызывает shouldCopyItemAtPath и shouldProceedAfterError
  • Если ~ / Desktop / source.txt не существует
    • NSFileManager не вызывает метод делегата и просто возвращает объект NSError
...