سؤال

وكيف لي أن إعادة تسمية ملف، حفظ الملف في نفس الدليل؟

ولدي سلسلة تحتوي على المسار الكامل للملف، وسلسلة تحتوي على اسم الملف الجديد (وليس المسار)، على سبيل المثال:

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

وأنا أعلم عن <أ href على NSFileManager ل= "http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSFileManager/ movePath: toPath: معالج: "يختلط =" noreferrer "> movePath: toPath: معالج: طريقة ، ولكن لا أستطيع تجريب كيفية بناء مسار الملف الجديد ..

وأساسا أنا أبحث عن ما يعادل رمز بيثون التالية:

>>> 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)
هل كانت مفيدة؟

المحلول

وNSFileManager وNSWorkspace لديهما أساليب معالجة الملف، ولكن - (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler NSFileManager هو على الأرجح أفضل رهان. استخدام أساليب مسار التلاعب NSString للحصول على أسماء الملفات والمجلدات الحق. على سبيل المثال،

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

ويتم شرح كل الطبقات بشكل جيد في مستندات، ولكن ترك تعليق إذا كان هناك أي شيء أنت لا تفهم.

نصائح أخرى

ومن الجدير بالذكر أن نقل ملف لنفسها ستفشل. كان لي طريقة التي حلت محل فضاءات مع يؤكد وجعل صغيرة اسم الملف وإعادة تسمية الملف إلى الاسم الجديد. سوف الملفات بكلمة واحدة فقط في اسم تفشل إعادة تسمية كاسم جديد ستكون متطابقة على نظام ملفات تحسس حالة الأحرف.

وكانت الطريقة I حل هذه للقيام تسمية خطوتين، أولا إعادة تسمية الملف إلى اسم مؤقت ومن ثم تسميته إلى اسم المقصود.

وبعض شبة الكود شرح هذا:

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

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

والحل:

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

وأنا فقط أردت أن يجعل هذا أسهل للفهم لمبتدئ. وهنا كافة التعليمات البرمجية:

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

وهنا هو لمزيد من الأمثلة الحديثة لدائرة الرقابة الداخلية، وطريقة NSFileManager يختلف قليلا:

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

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

لتتويج على القمة، وفئة على 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top