从文件夹获取文件时出现问题,错误识别文件夹。 (目标c)

时间:2011-09-19 22:08:49

标签: objective-c directory nsurl nsfilemanager nsopenpanel

我让用户从NSOpenPanel中选择一个文件夹。这将返回一个文件路径,如:file:// localhost / Folder。这是我的代码,它出错了:

NSURL *filePath = [openDlg URL]; //OpenDlg is my NSOpenPanel
NSString *s = [filePath absoluteString];
NSLog(@"%@",s);
NSError *error;
NSArray *b = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:s error:&error];
if (error) {
    NSLog(@"%@",error);
}
NSLog(@"%lu",b.count);

这里,无论我选择哪个文件夹,都会发送此错误消息:文件夹“Folder”不存在。“UserInfo = 0x10518b320 {NSFilePath = file:// localhost / Folder,NSUserStringVariant =(     夹 ),NSUnderlyingError = 0x10515d5e0“操作无法完成。(OSStatus error -43。)”}

发生什么事了?!?如果这不是最好的方法,我怎么能访问文件夹里面的所有文件?

1 个答案:

答案 0 :(得分:0)

请尝试使用此方法:

- (NSArray *)contentsOfDirectoryAtURL:(NSURL *)url includingPropertiesForKeys:(NSArray *)keys options:(NSDirectoryEnumerationOptions)mask error:(NSError **)error

您只需传入NSURL而无需将其转换为NSString。为了举例说明如何使用它,请参阅下文:

[[NSFileManager defaultManager] contentsOfDirectoryAtURL:filePathURL 
                              includingPropertiesForKeys:[NSArray arrayWithObjects:NSURLNameKey, nil]
                                                 options:NSDirectoryEnumerationSkipsHiddenFiles 
                                                   error:&error];

我无法看到你如何设置你的NSOpenPanel,所以我还将在下面提供一个如何设置它的例子:

NSOpenPanel *openPanel = [NSOpenPanel openPanel];

[openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result){

        if (result == NSFileHandlingPanelOKButton) {
            NSArray* urls = [openPanel URLs];

            NSURL *url = [urls objectAtIndex:0];
            if (url != nil) {

                // If you want to convert the path to a NSString
                self.filePathString = [url path];
                // If you want to keep the path as a NSURL
                self.filePathURL = url;

            }

        }

    }];

上述方法将在用户按下OK按钮后获取文件或文件夹的路径。尝试一下,看看它是否有效。为了进一步阐述我建议你使用NSURL的原因,这里是Apple文档给出的解释:

指定文件或目录位置的首选方法是使用NSURL类。虽然NSString类有许多与路径创建相关的方法,但URL提供了一种更健壮的方法来定位文件和目录。对于也使用网络资源的应用程序,URL还意味着您可以使用一种类型的对象来管理位于本地文件系统或网络服务器上的项目。