首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用IOS7计算文档和数据存储

使用IOS7计算文档和数据存储
EN

Stack Overflow用户
提问于 2014-01-15 11:51:19
回答 2查看 249关注 0票数 1

我正在试图找到我的IOS应用程序的文档目录的总大小。我相信这是我在“使用”下的Settings应用程序中看到的值(文档和数据,这个值现在是40 is )。通过使用这种方法:

代码语言:javascript
运行
复制
-(int)sizeOfFolder:(NSString *)folderPath
{
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:nil];
NSEnumerator *contentsEnumurator = [contents objectEnumerator];

NSString *file;
unsigned long long int folderSize = 0;

while (file = [contentsEnumurator nextObject]) {
    NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:file] error:nil];
    folderSize += [[fileAttributes objectForKey:NSFileSize] intValue];
}

//This line will give you formatted size from bytes ....
//NSString *folderSizeStr = [NSByteCountFormatter stringFromByteCount:folderSize countStyle:NSByteCountFormatterCountStyleFile];

NSLog(@"size: %llu", folderSize);

return folderSize;
} 

我总是得到同样的价值。这是我传递给方法的路径:

代码语言:javascript
运行
复制
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* rootPath = [paths objectAtIndex:0];
int space = [self sizeOfFolder:rootPath];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-15 14:08:48

首先,您应该小心处理文件类型。您应该使用long long来计算总大小:

代码语言:javascript
运行
复制
unsigned long long folderSize = 0; // remove int here
// ...
folderSize += [[fileAttributes objectForKey:NSFileSize] longLongValue]; // note longLongValue

接下来,您应该跳过目录以获得更准确的结果。

代码语言:javascript
运行
复制
if (![fileAttirbutes[NSFileType] equalsToString:NSFileTypeDirectory]) {
    folderSize += ...
}

我建议您考虑另一种目录枚举方法。使用- (NSDirectoryEnumerator *)enumeratorAtURL:(NSURL *)url includingPropertiesForKeys:(NSArray *)keys options:(NSDirectoryEnumerationOptions)mask errorHandler:(BOOL (^)(NSURL *url, NSError *error))handler将允许您执行更深层次的目录枚举,并递归地列出所有目录内容。

代码语言:javascript
运行
复制
unsigned long long count = 0;
NSNumber *value = nil;

for (NSURL *url in [[NSFileManager defaultManager] enumeratorAtURL:directoryURL includingPropertiesForKeys:@[NSURLFileSizeKey] options:0 errorHandler:NULL]) {
    if ([url getResourceValue:&value forKey:NSURLFileSizeKey error:outError]) {
        count += [value longLongValue];
    } else {
        return nil;
    }
}

return @(count);
票数 1
EN

Stack Overflow用户

发布于 2014-01-15 13:37:38

NSFileManager没有返回文件夹(文件夹+内容)大小的功能。在网上发现了这个。

  • (无符号长) fastFolderSizeAtFSRef:( FSRef *)theFileRef { FSIterator thisDirEnum = NULL;无符号长totalSize = 0;//迭代目录内容,如果(FSOpenIterator(theFileRef,kFSIterateFlat & this directory ) == noErr) { const ItemCount kMaxEntriesPerFetch = 256;ItemCount actualFetched;FSRef fetchedRefskMaxEntriesPerFetch;FSCatalogInfo fetchedRefskMaxEntriesPerFetch;// DCJ注意到,这现在只是获取数据大小.如果我们决定包含//资源叉,我们将不得不添加kFSCatInfoRsrcSizes OSErr fsErr = FSGetCatalogInfoBulk(thisDirEnum,kMaxEntriesPerFetch,&actualFetched,NULL,kFSCatInfoDataSizes kFSCatInfoNodeFlags,fetchedInfos,fetchedRefs,NULL,NULL);we (fsErr == noErr) \(fsErr == errFSNoMoreItems)) { ItemCount thisIndex;for (thisDirEnum= 0;<;( thisIndex++) { // Recurse,如果它是文件夹if (fetchedInfosthisIndex.nodeFlags & kFSNodeIsDirectoryMask) { totalSize += [self快速fastFolderSizeAtFSRef:&提取刷新索引];}{ totalSize += fetchedInfos thisIndex.dataLogicalSize;}}若(fsErr == errFSNoMoreItems) { break;}{ // get更多项fsErr = FSGetCatalogInfoBulk(thisDirEnum,kMaxEntriesPerFetch,&actualFetched,NULL,kFSCatInfoDataSizes get,fetchedInfos,fetchedRefs,NULL,NULL);} FSCloseIterator(thisDirEnum);}返回totalSize;}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21136668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档