Suis-je fou? Aide avec NSFileManager méthode déléguée shouldProceedAfterError dans 10.5+

StackOverflow https://stackoverflow.com/questions/2103054

Question

Je suis une sorte de n00b cacao, mais je vous écris ce petit programme simple et je ne peux pas obtenir la méthode déléguée NSFileManager « shouldProceedAfterError ... » au feu. Voici le code que je suis en cours d'exécution dans mon 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;
}

La situation dans laquelle je suis en train de traiter est de savoir si le fichier existe déjà à la destination. Je reçois une erreur, mais je ne me trace que « plus l'erreur ... » à la sortie. Je fais aussi obtenir cette trace de shouldCopyItemAtPath: donc je ne sais pas exactement pourquoi la méthode ne se déclenche pas?

Vais-je fou, comment ai-je la pagaille de mise en œuvre des délégués ici? Merci pour toute aide!

Était-ce utile?

La solution

Ceci est juste une hypothèse, mais comme copyItemAtPath: toPath: erreur est définie de telle sorte que «Le fichier spécifié dans srcpath doit exister, alors que dstPath ne doit pas exister avant l'opération » , peut-être scénario où dstPath existe déjà est pas considéré comme une « erreur », et donc ne se déclenche pas le délégué.

i.e.. peut-être « Ce n'est pas une erreur si vous faites quelque chose que nous vous dit de ne pas le faire. »

Vous pouvez toujours faire le chèque et supprimer vous-même:

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

Autres conseils

Probablement que vous fournissez un mauvais chemin en tant que source
copyItemAtPath ne remet pas les méthodes de délégué si le chemin source est non valide.
Vous pouvez tester que si vous utilisez la méthode suivante:

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

Lorsque vous appelez cette méthode, je remarque le comportement suivant:

  • Si ~ / Desktop / source.txt est un fichier et ~ / Desktop / target.txt n'existe pas:
    • NSFileManager appelle la méthode délégué shouldCopyItemAtPath
  • Si ~ / Desktop / source.txt est un fichier et ~ / Bureau existe / target.txt:
    • NSFileManager appelle d'abord la shouldCopyItemAtPath et shouldProceedAfterError
  • Si ~ / Desktop / source.txt n'existe pas
    • NSFileManager ne remet pas de méthode de délégué et retourne juste un NSError objet
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top