Rinomina il file in Cacao?

Come faccio a rinominare un file, mantenendo il file nella stessa directory?

Ho una stringa contenente il percorso completo di un file, e una stringa contenente il nome del file (e non), ad esempio:

NSString *old_filepath = @"/Volumes/blah/myfilewithrubbishname.avi";
NSString *new_filename = @"My Correctly Named File.avi";

Conosco NSFileManager del movePath:toPath:gestore: metodo, ma io non allenamento come costruire il nuovo percorso del file..

Fondamentalmente sto cercando l’equivalente al seguente codice Python:

>>> import os
>>> old_filepath = "/Volumes/blah/myfilewithrubbishname.avi"
>>> new_filename = "My Correctly Named File.avi"
>>> dirname = os.path.split(old_filepath)[0]
>>> new_filepath = os.path.join(dirname, new_filename)
>>> print new_filepath
/Volumes/blah/My Correctly Named File.avi
>>> os.rename(old_filepath, new_filepath)
InformationsquelleAutor dbr | 2009-05-16



5 Replies
  1. 36

    NSFileManager e NSWorkspace entrambi hanno file di metodi di manipolazione, ma NSFileManager del - (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler è probabilmente la vostra scommessa migliore. Utilizzare NSString percorso di metodi di manipolazione per ottenere i nomi di file e cartelle a destra. Per esempio,

    NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];
    [[NSFileManager defaultManager] movePath:oldPath toPath:newPath handler:nil];

    Entrambe le classi sono spiegato abbastanza bene nella documentazione, ma di lasciare un commento se c’è qualcosa che non capisco.

    • Ah, mi mancava il stringBy___PathComponents metodi, grazie!
    • movePath:toPath:gestore: è deprecato in favore di moveItemAtPath:toPath:errore:, che, se non riesce, in grado di accorgersi di perché non è riuscito.
    • Ciao, @Marc Charbonneau .So che questa risposta è meraviglioso.Ma è una domanda che voglio “newFilename” hanno un “/”.Esempio,voglio rinominare “123.mp3” a “12/3.mp3”,Che non avrebbe funzionato.Penso NSFileManager vedere la “/” come percorso.
    • Sconsigliata a partire da OS X 10.5
  2. 14

    Vale la pena notare che lo spostamento di un file stesso avrà esito negativo. Ho avuto un metodo che ha sostituito gli spazi con il carattere di sottolineatura e fatto il nome del file in minuscolo e rinominato il file con il nuovo nome. I file con una sola parola, il nome fallirebbe la rinominare il nuovo nome dovrebbe essere identico su un case-insensitive file di sistema.

    Il modo in cui ho risolto questo era per fare un passaggio di due rinominare, prima a rinominare il file con un nome temporaneo e quindi rinominare il nome che si intende assegnare.

    Alcuni pseudocodice spiegare questo:

    NSString *source = @"/FILE.txt";
    NSString *newName = [[source lastPathComponent] lowercaseString];
    NSString *target = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];
    
    [[NSFileManager defaultManager] movePath:source toPath:target error:nil]; //<-- FAILS

    La soluzione:

    NSString *source = @"/FILE.txt";
    NSString *newName = [[source lastPathComponent] lowercaseString];
    
    NSString *temp = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-temp", newName]];
    NSString *target = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];
    
    [[NSFileManager defaultManager] movePath:source toPath:temp error:nil];
    [[NSFileManager defaultManager] movePath:temp toPath:target error:nil];
    • Beh, direi che solo il controllo se i nuovi e i vecchi nomi sono uguali prima di passare è probabilmente meglio per le prestazioni di spostamento di un file due volte.
    • Ma questo non raggiungere l’obiettivo di cambiare il nome del file del caso.
  3. 8

    Volevo solo rendere questo più facile da capire per un principiante. Ecco tutto il codice:

        NSString *oldPath = @"/Users/brock/Desktop/OriginalFile.png";
    NSString *newFilename = @"NewFileName.png";
    
    NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];
    [[NSFileManager defaultManager] movePath:oldPath toPath:newPath handler:nil];
    
    NSLog( @"File renamed to %@", newFilename );
  4. 4

    ecco un altro recente esempio per iOS, il NSFileManager metodo è un po ‘ diverso:

    NSString *newFilename = [NSString stringWithFormat:@"%@.m4a", newRecording.title];
    
    NSString *newPath = [[newRecording.localPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];
    [[NSFileManager defaultManager] moveItemAtPath:newRecording.localPath toPath:newPath error:nil];
  5. 0

    Per la glassa sulla parte superiore, una categoria NSFileManager:

    @implementation NSFileManager (FileManipulations)
    
    
    - (void)changeFileNamesInDirectory:(NSString *)directory changeBlock:(NSString * (^) (NSString *fileName))block
    {
        NSString *inputDirectory = directory;
    
        NSFileManager *fileManager = [NSFileManager new];
    
        NSArray *fileNames = [fileManager contentsOfDirectoryAtPath:inputDirectory error:nil];
        for (NSString *fileName in fileNames) {
    
            NSString *newFileName =  block(fileName);
    
            NSString *oldPath = [NSString stringWithFormat:@"%@/%@", inputDirectory, oldFileName];
            //move to temp path so case changes can happen
            NSString *tempPath = [NSString stringWithFormat:@"%@-tempName", oldPath];
            NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFileName];
    
            NSError *error = nil;
            [fileManager moveItemAtPath:oldPath toPath:tempPath error:&error];
            if (error) {
                NSLog(@"%@", [error localizedDescription]);
                return;
            }
            [fileManager moveItemAtPath:tempPath toPath:newPath error:&error];
            if (error) {
                NSLog(@"%@", [error localizedDescription]);
            }
        }
    }
    
    
    @end

Lascia un commento