stringByAppendingPathComponent,它有效吗?

fuz*_*oat 9 cocoa objective-c

EDIT_v002

我看了所有的评论,我开始看到我应该做什么.为此我修改了我的代码(见下文)我已将newPath更改为NSString,删除了[[alloc] init]和end [release],因为它现在由系统处理.我正在使用stringByAppendingPathComponent,让它在rootPath和fileName分配给NSString之前添加一个分隔符.它确实有效,我通过静态分析仪运行它没有任何问题.

// ------------------------------------------------------------------- **
// DISC: FILEWALKER ..... (cocoa_fileWalker.m)
// DESC: List all "*.png" files in specified directory
// ------------------------------------------------------------------- **
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *fileName;
    NSDictionary *attrDir;
    NSError *myError;
    NSNumber *fileSize;
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *rootPath = [@"~/Pictures/Ren/PRMan" stringByExpandingTildeInPath];
    NSString *newPath;

    NSLog(@"Home: %@",rootPath);

    for(fileName in [manager enumeratorAtPath:rootPath]){
        if ([[fileName pathExtension] isEqual:@"png"]) {    

            newPath = [rootPath stringByAppendingPathComponent:fileName];   
            attrDir = [manager attributesOfItemAtPath:newPath error:&myError];
            fileSize = [attrDir objectForKey: @"NSFileSize"];
            NSLog(@"File: %@ Size: %@", newPath, fileSize);
        }
    }
    [pool drain];
    return 0;
}
// ------------------------------------------------------------------- **
Run Code Online (Sandbox Code Playgroud)

加里

Pet*_*sey 15

stringByAppendingPathComponent,它有效吗?

简单.您想要追加路径组件.您将该消息发送到要附加路径组件的字符串,并传递要追加的路径组件.

路径组件不是斜线; 如果是,那么该pathComponents方法只返回一个斜杠数组.路径组件是斜杠之间的部分(尽管有一个特殊情况,在定义中描述pathComponents).

斜杠是路径分隔符.这在Cocoa中是硬编码的; 它目前(并且可能永远是)斜线.所以,如果你真的想要一个斜杠追加到一个字符串,最可能的原因是,你要追加路径分隔符,而不是一个路径组件.

    [newPath setString:rootPath];
    [newPath appendString:@"/"];
    [newPath appendString:fileName];
Run Code Online (Sandbox Code Playgroud)

fileName是您要添加的组件.使用stringByAppendingPathComponent:和传递fileName,而不是斜线.

至于你的例子是否泄漏:那么,一个对象是否会在没有被释放的情况下超出范围?这个问题的答案就是它是否是泄漏的答案.如果您不确定,请查看内存管理规则.


nal*_*all 5

您不附加分隔符.您追加下一个路径组件(例如filename,dir等).这可以避免您需要知道特定系统的分隔符.

NSMutableString* mutablePath = [NSMutableString string];
NSString* fullPath = [rootPath stringByAppendingPathComponent:filename];

[mutablePath setString:fullPath]; // OK to setString: of Mutable with non-Mutable
[mutablePath appendString:someOtherString]; // This won't cause an exception

// Example to clarify on comments below
{
    // This will cause a compiler warning.
    // warning: incompatible Objective-C types assigning
    //    ‘struct NSString *’, expected ‘struct NSMutableString *’
    NSMutableString* ms = [@"FOO" stringByAppendingPathComponent:@"BAR"];
}
Run Code Online (Sandbox Code Playgroud)

文档中有一个相当清楚的例子.


Qui*_*lor 5

所有现有的答案都泄漏了原始testPath字符串.对于像这样简单的事情,为什么没有人推荐-[NSMutableString appendString:]intead?

[testPath appendString:@"/"];
Run Code Online (Sandbox Code Playgroud)

没有相当于-stringByAppendingPathComponent:NSMutableString,但看起来他只是想尝试添加斜杠,而不是路径组件.如果您真的想添加路径组件,可以这样做:

[testPath setString:[testPath stringByAppendingPathComponent:@"..."]];
Run Code Online (Sandbox Code Playgroud)

这是一个令人烦恼的解决方法,但正如@dreamlax指出的那样-stringByAppendingPathComponent:,即使在NSMutableString对象上调用时,也总是返回一个不可变的字符串.:-(

  • 我理解这一点,但它仍然返回一个新的自动释放字符串,而不是修改可变字符串的内容,正如人们可能期望的那样,如果有一个名为`-appendPathComponent:`的方法. (3认同)
  • 看起来这是获得原始提问者想要的最简单方法,并且结果仍然是NSMutableString. (3认同)