如何检查当前 UITableView 行的文档文件大小
Posted
技术标签:
【中文标题】如何检查当前 UITableView 行的文档文件大小【英文标题】:How to check the current UITableView row's document file size 【发布时间】:2012-01-28 17:07:38 【问题描述】:我目前有一个 UITableView 显示我的应用程序的文档目录。如何获取当前行文档的文件大小?
我的代码目前如下:
- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// layout the cell
cell.textLabel.text = [self.drive.filesArray objectAtIndex:indexPath.row];
NSInteger iconCount = [docInteractionController.icons count];
cell.imageView.image = [docInteractionController.icons objectAtIndex:iconCount - 1];
NSString *fileURLString = [self.drive.filesArray objectAtIndex:indexPath.row];
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:fileURLString error:nil];
NSString *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
long long fileSize = [fileSizeNumber longLongValue];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@",
fileSizeNumber, [self.drive.filesArray objectAtIndex:indexPath.row]];
return cell;
不幸的是,这不起作用。有什么想法吗?
【问题讨论】:
请注意:根据文档,NSFileSize
键下的值不是NSString*
类型,而是NSNumber*
。不确定,这是否与您的问题有关。
感谢您的提示,但如果我更改它仍然无法正常工作:(
NSFileManager 是否返回错误?你检查过错误是nil吗?
【参考方案1】:
我不知道 self.drive.filesArray 是什么,但如果你用 NSDocumentDirectory 来做,获取路径,然后获取该路径中的文件,它会起作用。
这是对我有用的示例,我认为这是在 ios 上处理应用程序文档目录的方式:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *files = [fm contentsOfDirectoryAtPath:documentsDirectory error:nil];
NSString *fileFirst = [files objectAtIndex:0];
NSString *fullPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, fileFirst];
NSDictionary *attrs = [fm attributesOfItemAtPath:fullPath error:nil];
long long fileSize = [attrs fileSize];
NSLog(@"File is %@ and size is %lld",fileFirst, fileSize)
你最终会得到类似的东西
2012-01-28 22:34:00.916 fileOperations[57498:f803] File is smallImage.jpg and size is 30979
我认为你仍然有错误的路径,我的(在 iOS 5.0.1 的 iPhone 上)是
/var/mobile/Applications/DA47CD6A-8AA8-4739-8CCB-6087F30C0954/Documents/smallImage.jpg
这里的重点是文档。更正您的代码以获取正确的路径,将文件保存到正确的路径,您应该能够从文件中获取属性。您的文件可能不存在,或者 fm 只是无权获取您想要的内容。我不知道,因为您将错误从文件管理器发送到 nil 对象。还有一个问题,你是如何收集 self.drive.filesArray 数组的? 尝试以这种方式收集你的 self.drive.filesArray,我在上面写过。它有效。
【讨论】:
是的,这正是我在项目中的做法,只是我说的是NSString* fullPath = [documentsDirectory stringByAppendingPathComponent:fileFirst];
。
完美,对我有用!唯一的问题是,它总是以千字节为单位吗?如何在数字后面加上“类型”(例如“234kb”)?
这个大小以字节为单位。您必须将其除以 1024 才能获得 KB 或 1048576 才能获得 MB 大小。【参考方案2】:
你应该修复你的代码:
NSLog(@"fileURLString %@", fileURLString);
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:fileURLString error:nil];
NSLog(@"fileAttributes %@", fileAttributes);
NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
NSLog(@"fileSizeNumber %@", fileSizeNumber);
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@", fileSizeNumber, [self.drive.filesArray objectAtIndex:indexPath.row]];
检查您是否提供了正确的 fileURLString 来获取属性。要了解有关 iOS 应用程序目录结构的更多信息,熟悉File System Programming Guide 很有用
【讨论】:
那个(不管它是什么)不能为空,对象只能为空。我更新了代码以使调试更容易 所以问题在于完全分类的文件路径,而不是您提供的文件名。其余的都是正确的 我现在有以下代码:pastie.org/3271473 和以下日志:pastie.org/3271478 - 出了什么问题? 尝试使用更多的错误安全方法,例如: NSString *filePath = [[NSBundle mainBundle] pathForResource:@"back" ofType:@"png"];并在您的特定情况下检查正确的文件路径。请注意,文件路径取决于您是在真实设备上还是在设备模拟器中执行代码 只为所有内容返回 (null)。我使用的是我的实际 iPhone,而不是模拟器。以上是关于如何检查当前 UITableView 行的文档文件大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在具有 UITableview 行的 UICollectionViewCell 中显示 Json Array 数据?