Frage

Wie würde ich eine Datei umbenennen, die Datei im selben Verzeichnis zu halten?

Ich habe eine Zeichenfolge, die einen vollständigen Pfad zu einer Datei enthält, und eine Zeichenfolge, die einen den neuen Dateinamen (und kein Pfad) enthält, zum Beispiel:

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

Ich weiß, über NSFileManager movePath: toPath: handler: Methode, aber ich kann nicht trainieren, wie die neuen Dateipfad zu konstruieren ..

Im Grunde suche ich nach dem entspricht den folgenden Python-Code:

>>> 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)
War es hilfreich?

Lösung

NSFileManager und NSWorkspace haben beide Dateimanipulationsmethoden, aber NSFileManager - (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler ist wahrscheinlich die beste Wahl. Verwenden Sie NSString Pfad Manipulationsmethoden vor, die Datei- und Ordnernamen zu erhalten. Zum Beispiel:

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

sind Beiden Klassen erklären ziemlich gut in der Dokumentation, sondern einen Kommentar hinterlassen, wenn es etwas gibt, die Sie nicht verstehen.

Andere Tipps

Es ist erwähnenswert, dass eine Datei selbst bewegt wird fehlschlagen. Ich hatte eine Methode, die Räume mit Unterstrichen ersetzt und die Dateinamen in Kleinbuchstabe gemacht und die Datei auf den neuen Namen umbenannt. Dateien mit nur einem Wort im Namen scheitern würden die Umbenennungs als der neue Name auf Groß- und Kleinschreibung Dateisystem identisch sein würde.

So wie ich dieses Problem gelöst war ein Zwei-Schritt-Umbenennungs zu tun, zuerst die Datei in einen temporären Namen umbenennen und es dann an den gewünschten Namen umbenennen.

Einige Pseudo-Code erklärt dies:

NSString *source = @"/FILE.txt";
NSString *newName = [[source lastPathComponent] lowercaseString];
NSString *target = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];

[[NSFileManager defaultManager] movePath:source toPath:target error:nil]; // <-- FAILS

Die Lösung:

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

Ich wollte nur diese einfacher machen für einen Neuling zu verstehen. Hier ist der gesamte Code:

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

hier ist ein neueres Beispiel für iOS ist die NSFileManager Methode ein wenig anders:

NSString *newFilename = [NSString stringWithFormat:@"%@.m4a", newRecording.title];

NSString *newPath = [[newRecording.localPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];
[[NSFileManager defaultManager] moveItemAtPath:newRecording.localPath toPath:newPath error:nil];

Für die Glasur auf einer Kategorie auf 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top