1

我让用户从 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);

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

到底是怎么回事?!?如果这不是最好的方法,我如何访问文件夹内的所有文件?

4

1 回答 1

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;

            }

        }

    }];

用户按下确定按钮后,上述方法将获取文件或文件夹的路径。试一试,看看它是否有效。为了进一步详细说明我为什么建议您使用 NSURL,以下是 Apple 文档给出的解释:

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

于 2011-09-19T22:37:05.240 回答