【发布时间】:2014-10-10 19:31:21
【问题描述】:
我的应用有一个草稿表视图,显示用户保存的音频文件。对于数据源数组,我遍历草稿目录(在NSDocumentDirectory 内)。该代码工作正常,它显示了我迄今为止保存的所有文件。
问题是,就在最近,除了前两个文件之外的所有文件都是空的。空,我的意思是:当我使用 NSData 的 datatWithContentsOfFile 方法时,数据长度为 0,即 0 字节。前两个文件仍然有数据,每个文件大约 267639 b。
但是如果文件中没有数据,为什么在我遍历草稿目录时会出现?这些空文件直到最近才完好无损。什么可能导致它们变空?
以下是用于循环草稿目录的代码。
// check if drafts folders exist
BOOL draftsFoldersExist = NO;
NSError *error = nil;
NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSArray *appFolderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[folders objectAtIndex:0] error:&error];
if ([appFolderContents count] > 0 && error == nil) {
for (NSString *item in appFolderContents) {
if ([item isEqualToString:@"drafts"])
draftsFoldersExist = YES;
}
}
_draftsArray = [[NSMutableArray alloc] init];
if (draftsFoldersExist) {
// drafts data source
NSString *draftsPath = [NSString stringWithFormat:@"%@/drafts", [folders objectAtIndex:0]];
NSString *draftsPathEncoded = [draftsPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *draftsPathURL = [NSURL URLWithString:draftsPathEncoded];
// enumerate files in drafts folders
NSArray *desiredProperties = @[NSURLIsReadableKey, NSURLCreationDateKey];
NSArray *drafts = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:draftsPathURL includingPropertiesForKeys:desiredProperties options:0 error:&error];
for (NSURL *item in drafts) {
NSMutableDictionary *draftDict = [[NSMutableDictionary alloc] init];
// name
NSString *name = [item lastPathComponent];
// is readable
NSNumber *isReadableBoolValue = nil;
[item getResourceValue:&isReadableBoolValue forKey:NSURLIsReadableKey error:&error];
if ([isReadableBoolValue isEqualToNumber:@YES]) {
// filename
[draftDict setValue:[name stringByDeletingPathExtension] forKey:@"draftFilename"];
// creation date
NSDate *creationDate = nil;
[item getResourceValue:&creationDate forKey:NSURLCreationDateKey error:&error];
[draftDict setValue:creationDate forKey:@"creationDate"];
// insert into first position of data source array
_draftsArray = [[@[draftDict] arrayByAddingObjectsFromArray:_draftsArray] mutableCopy];
// meta
} else {
NSLog(@"unreadable item: %@", name);
}
}
}
更新:
我根据@Joride 的建议通过管理器下载了应用程序目录的文件,发现所有文件都完好无损并带有数据。他们在这里:
2014-08-08_20-53-30.m4a
2014-08-09_19-11-08.m4a
2014-08-10_17-36-28.m4a
2014-08-11_18-53-46.m4a
2014-08-13_12-57-57.m4a
2014-08-16_20-44-33.m4a
2014-08-16_20-45-06.m4a
我想现在的问题是为什么其中一些没有使用dataWithContentsOfFile 方法显示任何数据。
我使用下面的代码来初始化 NSData 对象:
NSData *fileData = [NSData dataWithContentsOfFile:filepath options:NSDataReadingMapped error:&readingError];
对于数据为零的文件,读取错误为“无法完成操作。没有这样的文件或目录”。
【问题讨论】:
-
您可能需要显示用于存储和检索文件的代码。
-
@Joride 你去吧
-
太棒了。现在要去读了。在我做之前:您可以从 xcode organozer(在设备下)下载整个 app-dir。选择“检查包”以查看内容。你的文件在吗?这些文件有多大?
-
我感觉您手动构建路径/URLS 的方式有些不对劲。我现在在 iPhone 上,所以很难阅读代码。我会在我使用 Mac 时回帖。
-
这是一个从管理器下载文件的巧妙技巧——不知道你能做到这一点!文件确实完好无损 - 我编辑了我的答案。
标签: ios objective-c