gpt4 book ai didi

ios - 应用文档目录中的空文件

转载 作者:行者123 更新时间:2023-11-28 22:00:15 24 4
gpt4 key购买 nike

我的应用有一个草稿 TableView ,显示用户保存的音频文件。对于数据源数组,我循环遍历草稿目录(在 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];

对于数据为零的文件,读取错误为“操作无法完成。没有这样的文件或目录”。

最佳答案

我发现了问题。该应用程序的文档目录在某个时候发生了变化,因此文件的位置发生了变化。

文件保存在这里:

/var/mobile/Applications/09E7C349-6D03-4D2F-BE17-46C00B17C9F5/Documents/drafts/2014-08-13_12-57-57.m4a

稍后在这里:

/var/mobile/Applications/1A444A31-C29D-4B0F-8B47-A5B57D7F3281/Documents/drafts/2014-08-16_20-45-06.m4a

请注意,应用程序的文件夹具有不同的 token 。所以文件“在那里”但我猜不在那里。显然,当使用新的配置文件或应用商店有更新时,应用的目录可能会发生变化(请参阅 this answer)。

所以这个故事的寓意是:不要将绝对路径保存为对文件的引用。

关于ios - 应用文档目录中的空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25353936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com