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

Posted

技术标签:

【中文标题】无法读取资源文件夹中的文件 - iOS【英文标题】:Unable to read files in resources folder - iOS 【发布时间】:2013-01-25 05:54:02 【问题描述】:

我正在尝试读取位于资源文件夹内 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

即使文件不存在,路径也不会返回 nil,并且无论文件是否存在,fileExistsAtPath: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);

但它有同样的问题。

【问题讨论】:

你想从文档的目录中读取它吗? 【参考方案1】:

绝对肯定地确保您要读取的文件是 NSUTF8StringEncoding,否则您将遇到此类错误,这会误导您不告诉您由于编码不匹配而未读取该文件。

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

【讨论】:

【参考方案2】:

您不是从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 的文本文件的屏幕截图。希望能帮助到你。快乐编码:-)

【讨论】:

我想你误解了我的问题......我在资源文件夹中有一个名为“对象银行”的文件夹。所需的文件可能存在也可能不存在。但是即使文件存在,我也无法读取该文件。即使文件不存在,fileExistsAtPath 也会返回 yes。【参考方案3】:

我必须在网址中添加 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

【讨论】:

以上是关于无法读取资源文件夹中的文件 - iOS的主要内容,如果未能解决你的问题,请参考以下文章

Java IO流 之 ResourceBundle 读取国际化资源文件

QFile.open 无法打开资源 qrc 中的文件

Ionic 2 无法使用 IOS 模拟器上资源中的音频文件

无法从资源中读取文件

读取资源文件方法

Apache Drill 无法从 HDFS 读取文件(资源错误:无法创建模式树)