无法读取资源文件夹中的文件 - iOS

时间:2013-01-25 05:54:02

标签: ios objective-c ipad nsbundle

我正在尝试读取位于资源文件夹内的目录Object Bank中的文件。

//Get path for file in object bank
NSString* path = [[NSBundle mainBundle] pathForResource:fileId ofType:@"eam" inDirectory:@"Object Bank"];
NSError *error=nil;

//Check if it is present at the location
Boolean prepositioned=[[NSFileManager defaultManager] fileExistsAtPath:path];
NSLog(@"File Found : %@",prepositioned?@"Yes":@"No");

//This outputs "File Found : Yes"

//Read file
NSString *fileContents=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
NSLog(@"Prepostioned content length: %d",fileContents.length);
//This outputs "Prepostioned content length: 0"

//if file is present:
if (!error) {
    //Do something

}
else
{   
    //Print the error
    NSLog(@"Error : %@",error.description);
}

我收到以下错误:

Error Domain=NSCocoaErrorDomain Code=261 "The operation couldn’t be completed. (Cocoa error 261.)" UserInfo=0x8c410d0 {NSFilePath=/Users/ctb/Library/Application Support/iPhone Simulator/6.0/Applications/16881651-3790-4C87-A3A0-1E1D60563684/OAS IPAD.app/Object Bank/70118600.eam, NSStringEncoding=4}

即使文件不存在,路径也不会返回nilfileExistsAtPath:path总是返回yes,无论文件是否存在。

我也试过这个:

NSArray *paths =[[NSBundle mainBundle] pathsForResourcesOfType:@"eam" inDirectory:@"Object Bank"];
for (NSString *path in paths) {
    NSString *fileString=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"Resource : %u ",fileString.length);
}

但它有同样的问题。

3 个答案:

答案 0 :(得分:0)

您不是在Resources文件夹中阅读。您正试图从Object Bank目录中读取。回到nil是有道理的,因为那里不存在文件。

NSString *filePath = [[NSBundle mainBundle] pathForResource:fileId ofType:@"eam" inDirectory:@"Object Bank"];

NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:filePath]) {
        NSLog(@"file exist");
    }

下面是我尝试从资源目录中读取名为pk的文本文件的屏幕截图。希望能帮助到你。快乐的编码: - )

screenshot

答案 1 :(得分:0)

绝对肯定地确保您要读取的文件是NSUTF8StringEncoding,否则您会遇到这种类型的错误,这会导致错误,因为它没有告诉您由于编码不匹配而无法读取。< / p>

使用TextWrangler打开文件(类型为eam的fileId)并检查它具有的编码,然后在编码参数中使用该编码。

答案 2 :(得分:0)

我必须在网址中添加file://前缀

guard let resourceString = Bundle.main.resourcePath,
    let fileURL = URL(string: "file://\(resourceString)/mock.txt") else {

    print(">>> url fail")
    return
}

do {

    let data = try Data(contentsOf: fileURL)
    let string = String(data: data, encoding: .utf8)

    print(">>> \(string)")

} catch let error {

    print(">>> failed: \(error)")
    return
}