2010-01-20 4 views
4

Je suis un peu une n00b Cocoa, mais je vous écris ce simple petit programme et je ne peux pas obtenir la méthode déléguée NSFileManager « de shouldProceedAfterError ... » au feu. Voici le code que je suis en cours d'exécution dans mon AppDelegateSuis-je fou? Aide avec NSFileManager méthode déléguée shouldProceedAfterError dans 10.5+

-(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 que je suis en train de traiter est de savoir si le fichier existe déjà à la destination. J'obtiens une erreur, mais je n'ai jamais cette "plus d'erreur ..." trace à la sortie. J'obtiens aussi cette trace de shouldCopyItemAtPath: donc je ne suis pas exactement sûr pourquoi la méthode ne tire pas?

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

Répondre

4

Ceci est juste une hypothèse, mais puisque l'erreur copyItemAtPath: toPath: 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 le 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é.

dire peut-être « Ce n'est pas une erreur si vous faites quelque chose que nous vous dit de ne pas 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]; 
+1

"Ce n'est pas une erreur si vous faites quelque chose que nous vous avons dit de ne pas faire." doh. Je dois avoir totalement raté cette partie. J'espérais pouvoir implémenter une sorte de fenêtre modale dans la méthode des délégués, mais vous avez raison, j'ai juste besoin de vérifier avant de commencer la copie. Merci pour la réponse! Je voterais mais je n'ai pas de rep :( – Chief

1

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 invalide.
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 ~/bureau/target.txt n'existe pas:
    • NSFileManager appelle la méthode délégué shouldCopyItemAtPath
  • Si ~/Desktop/source.txt est un fichier et ~/Desktop/target.txt existe:
    • NSFileManager premier appelle le shouldCopyItemAtPath et shouldProceedAfterError
  • Si ~/Desktop/source.txt ne ne pas exister
    • NSFileManager ne remet pas de méthode de délégué et retourne juste un NSError
    objet
Questions connexes