.m文件到字符串

时间:2013-02-13 01:54:43

标签: objective-c xcode string macos nsfilemanager

我正在尝试将.m文件转换为字符串。我将搜索文件夹中的文件,然后想要将其每个内容用作字符串。这是我正在使用的代码:

- (IBAction)searchAction:(id)sender {

    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *dirContents = [fm contentsOfDirectoryAtPath:folderLabel.stringValue error:nil];
    NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.m'"];
    NSArray *onlyMs = [dirContents filteredArrayUsingPredicate:fltr];

    for (int i=0; i<[onlyMs count]; i++) {

        NSString* text = [[NSString alloc] initWithContentsOfFile:[onlyMs objectAtIndex:i]
                                            encoding:NSUTF8StringEncoding
                                            error:nil];
        NSLog(@"string: %@", text);

    }        
}

2013-02-13 02:38:05.700 LocalizedStringSearch[19001:303] string: (null)

除此之外,即使正确找到所有.m文件,所有返回的日志都为null。

任何人都知道我做错了什么?

非常感谢!

1 个答案:

答案 0 :(得分:0)

  1. 我认为contentsOfDirectoryAtPath:只提供一个文件名数组,而不是完整路径名,因此您需要在打开文件之前添加路径。编辑:我想我可能会对enumeratorAtPath:感到困惑...如果是这样,请继续使用您拥有的文件名,而不是将它们附加到原始文件夹名称。

  2. 这是一个例子(未经测试):

    NSString *fullPath = [folderLabel.stringValue stringByAppendingPathComponent:[onlyMs objectAtIndex:i];
    NSError *error = nil;
    NSString *text = [[NSString alloc] initWithContentsofFile:fullPath
                                                     encoding:NSUTF8StringEncoding
                                                        error:&error];
    
    if (text == nil)
        NSLog(@"%@", error);
    else
        NSLog(@"%@", text);
    
  3. 以上只有在文件实际使用UTF-8编码时才有效。如果您不确定编码,可以让框架尝试使用以下方法为您解决:

    NSString *fullPath = [folderLabel.stringValue stringByAppendingPathComponent:[onlyMs objectAtIndex:i];
    NSError *error = nil;
    NSStringEncoding enc;
    NSString *text = [[NSString alloc] initWithContentsofFile:fullPath
                                                 usedEncoding:&enc
                                                        error:&error];
    
    if (text == nil)
        NSLog(@"%@", error);
    else
        NSLog(@"%@", text);