Vra

Hoe sal ek 'n lêer hernoem en die lêer in dieselfde gids hou?

Ek het 'n string wat 'n volledige pad na 'n lêer bevat, en 'n string wat die nuwe lêernaam bevat (en geen pad nie), byvoorbeeld:

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

Ek weet van NSFileManager's beweegPad:naPad:hanteerder: metode, maar ek kan nie oefen hoe om die nuwe lêer se pad te bou nie..

Basies soek ek die ekwivalent aan die volgende Python-kode:

>>> 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)
Was dit nuttig?

Oplossing

NSFileManager en NSWorkspace het albei lêermanipulasiemetodes, maar NSFileManager se - (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler is waarskynlik jou beste weddenskap.Gebruik NSString se pad manipulasie metodes om die lêer en vouer name reg te kry.Byvoorbeeld,

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

Albei klasse word redelik goed in die dokumente verduidelik, maar los 'n opmerking as daar iets is wat jy nie verstaan ​​nie.

Ander wenke

Dit is opmerklik dat die verskuiwing van 'n lêer om homself sal misluk. Ek het 'n metode wat ruimtes vervang met onderstreping en het die lêernaam klein en herdoop tot die lêer na die nuwe naam. Lêers met net een woord in die naam sou die hernoem misluk as die nuwe naam identies op 'n geval-onsensitief lêerstelsel sou wees.

Die manier waarop ek dit opgelos was om 'n twee stap hernoem doen, in die eerste hernoeming die lêer na 'n tydelike naam en dan die hernoeming dit na die gewenste naam.

Sommige pseudokode verduidelik hierdie:

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 oplossing:

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

Ek wou dit net vir 'n nuweling makliker maak om te verstaan.Hier is al die kode:

    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 is 'n meer onlangse voorbeeld vir iOS, die NSFileManager metode is 'n bietjie anders:

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

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

Vir die versiersel bo-op, 'n kategorie op 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
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top