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

使用IOS7计算文档和数据存储,ios,Ios,我正在尝试查找IOS应用程序的documents目录的总大小。我相信这是我在使用中的设置应用程序中看到的值(文档和数据,这个值现在是40MB)。通过使用此方法: -(int)sizeOfFolder:(NSString *)folderPath { NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:nil]; NSEnumerator *contentsEn

我正在尝试查找IOS应用程序的documents目录的总大小。我相信这是我在使用中的设置应用程序中看到的值(文档和数据,这个值现在是40MB)。通过使用此方法:

-(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;
} 
我总是得到相同的值。这是我传递给方法的路径:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* rootPath = [paths objectAtIndex:0];
int space = [self sizeOfFolder:rootPath];

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

-(unsigned long-long)fastFolderSizeAtFSRef:(FSRef*)文件参考{
FSIterator thisDirEnum=NULL;
无符号长totalSize=0;
//迭代目录内容,根据需要递归
if(FSOpenIterator(theFileRef、kFSIterateFlat和thisDirEnum)==noErr)
{
const ItemCount kmaxentriespetch=256;
实际蚀刻的ItemCount;
FSRef fetchedRefs[kmaxentriespertech];
获取的FSCatalogInfo[kMaxEntriesPerFetch];
//DCJ注意,现在这只是获取数据叉大小…如果我们决定包括
//资源分叉我们将不得不添加KFSCATInformSrcSize
OSErr fsErr=FSGetCatalogInfoBulk(thisDirEnum、kMaxEntriesPerFetch和actualFetched,
NULL,kFSCatInfoDataSizes | kFSCatInfoNodeFlags,fetchedInfos,
fetchedRefs,NULL,NULL);
while((fsErr==noErr)| |(fsErr==errfsnomoreems))
{
项目计数指数;
对于(thisIndex=0;thisIndex

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

unsigned long long folderSize = 0; // remove int here
// ...
folderSize += [[fileAttributes objectForKey:NSFileSize] longLongValue]; // note longLongValue
接下来,您应该跳过目录以获得更准确的结果

if (![fileAttirbutes[NSFileType] equalsToString:NSFileTypeDirectory]) {
    folderSize += ...
}
我建议您研究另一种目录枚举方法。使用
-(NSDirectoryEnumerator*)EnumeratorURL:(NSURL*)url包括属性Forkeys:(NSArray*)键选项:(NSDirectoryEnumerationOptions)掩码错误处理程序:(BOOL(^)(NSURL*url,NSError*error))处理程序
将允许您执行更深入的目录枚举并递归列出所有目录内容

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);

我不明白你的问题,
我得到的总是相同的值。
?我的意思是,对于大小,我得到一个890字节的常量值,即使我保存其他文件,输入断点并检查你的
内容
数组?你得到什么了吗?谢谢Hassana,这段代码已经过测试了吗?它包含10多个红色错误…如果我想使用-(NSDirectoryEnumerator*)EnumeratorUrl:(NSURL*)url包括属性分叉:(NSArray*)键选项:(NSDirectoryEnumerationOptions)掩码错误处理程序:(BOOL(^)(NSURL*url,NSError*error))处理程序,该方法会变成什么样?抱歉,我从未使用过它…实际上,它允许您在早期阶段处理枚举错误,并通过返回NO来停止枚举:
BOOL^(NSURL*url,NSError*error){if(!url){NSLog(@“Unresolved error%@,%%@,”,error,[error userInfo]);返回NO;}否则返回YES;}
@Alessandro很抱歉在示例中出现了一些复制粘贴问题,从NSFileManager类别中获取代码:-)
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);