如何检查当前 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 中同时插入/删除行的问题

如何启用移动但禁用 UITableView 中某些行的删除

如何在 UITableView 中显示零行的表格

如何在具有 UITableview 行的 UICollectionViewCell 中显示 Json Array 数据?

Objective-C:如何将文档目录中的文件列出到 UITableView 中?

如何快速获取UITableView中每个动态创建的行的textvalue