我读了很多关于它的信息,做了一些测试并得到了错误的结果,我觉得我错过了什么。 我得到的唯一信息,这是正确的信息: DEVICE可用空间/总空间。
但我只需要有关我的APP的信息。所以:
感谢。
答案 0 :(得分:0)
对于第一个问题,下面的代码可行。但我不知道这种方法是否符合Apple的API使用。
// Get block size on user partition.
struct statfs *mntbufp = NULL;
getmntinfo(&mntbufp, 0);
int i, count = 0;
unsigned int blockSize;
count = getmntinfo(&mntbufp, 0);
for (i = 0; i < count; ++i)
{
// Find users partition.
if (strcmp(mntbufp[i].f_mntonname, "/private/var") == 0) {
blockSize = mntbufp[i].f_bsize;
break;
}
}
//get full pathname of bundle directory
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
//get paths of all of the contained subdirectories
NSArray *bundleArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:bundlePath error:nil];
//to access each object in array
NSEnumerator *filesEnumerator = [bundleArray objectEnumerator];
NSString *fileName;
unsigned long long int fileSize = 0;
unsigned long long int filesSize = 0;
unsigned long long int sizeOnDisk = 0;
NSError *error = nil;
//return next object from enumerator
while (fileName = [filesEnumerator nextObject]) {
NSDictionary *fileDictionary = [[NSFileManager defaultManager] attributesOfItemAtPath:[bundlePath stringByAppendingPathComponent:fileName] error:&error];
fileSize = [fileDictionary fileSize];
// File size is sum of all file sizes.
filesSize += fileSize;
// Calculate size on disk.
sizeOnDisk += ceil((double)fileSize / blockSize) * blockSize;
}
// Find sandbox path.
NSString *sandboxPath = NSHomeDirectory();
NSArray *sandboxArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:sandboxPath error:nil];
filesEnumerator = [sandboxArray objectEnumerator];
while (fileName = [filesEnumerator nextObject]) {
NSDictionary *fileDictionary = [[NSFileManager defaultManager] attributesOfItemAtPath:[sandboxPath stringByAppendingPathComponent:fileName] error:&error];
fileSize = [fileDictionary fileSize];
filesSize += fileSize;
sizeOnDisk += ceil((double)fileSize / blockSize) * blockSize;
}
//converts a byte count value into a textual representation that is formatted with the appropriate byte modifier (KB, MB, GB and so on)
NSString *fileSizeStr = [NSByteCountFormatter stringFromByteCount:filesSize countStyle:NSByteCountFormatterCountStyleBinary];
NSString *sizeOnDiskStr = [NSByteCountFormatter stringFromByteCount:sizeOnDisk countStyle:NSByteCountFormatterCountStyleBinary];`
这会计算整个捆绑的大小。部分功劳归入this stackoverflow question中的1218GG。但他的方法不计入二进制格式(iOS使用二进制系统; Mac OS 10.6及更高版本使用基本10系统。请参阅this article),并且不计入沙箱文件的大小。我修改/添加了相应的代码。
以下是iOS应用计算的文件大小与Mac Finder显示的文件大小之间的比较(Finder显示与应用计算):
61,801 B vs. 61 KB; 668 KB(637,472 B)vs。623 KB; 13.5 MB(13,520,085 B)与13.4 MB
有一些变化。 可能由于Mac OS计算文件大小和iOS计算文件大小之间的差异。 在iPhone runnig iOS 9上,系统显示204 KB,而我的方法计数为208 KB。当应用尺寸大于10 MB时,可以忽略变化。
答案 1 :(得分:-1)
您可以使用此功能在应用中查找缓存文档,然后将其删除:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *firstPath = paths[0];
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:firstPath error:nil];
NSEnumerator *contentsEnumurator = [contents objectEnumerator];
NSString *file;
unsigned long long int folderSize = 0;
while (file = [contentsEnumurator nextObject]) {
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[firstPath stringByAppendingPathComponent:file] error:nil];
folderSize += [[fileAttributes objectForKey:NSFileSize] intValue];
}
folderSize = folderSize / 1000.0f / 1000.0f; // Folder size in MB (more pressition folderSize/1024.0f/1024.0f);
NSMutableArray *filesToRemove = [[NSMutableArray alloc] init];
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:firstPath error:NULL];
for (NSString *path in files) {
BOOL isDir;
NSString *filePath = [[[self class] cachesDirectoryPath] stringByAppendingPathComponent:path];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDir];
if (fileExists && !isDir) {
NSString *filePath = [NSString stringWithFormat:@"%@/%@", firstPath ,path];
NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath: filePath error:NULL];
NSDictionary *fileDescription = [[NSDictionary alloc] init];
@try {
//Adds the file description to the files to remove
fileDescription = @{
@"kFilePath": filePath,
@"kFileSize": [attr objectForKey:NSFileSize],
@"kFileModificationDate": [attr objectForKey:NSFileModificationDate]
};
} @catch (NSException *exception) {
NSLog(@"File description problem");
}
if (fileDescription.allKeys.count > 0) {
[filesToRemove addObject:fileDescription];
}
}
}
float removedMB = 0;
for (NSDictionary *fileDescription in filesToRemove) {
NSLog(@"Removing file: %@", [fileDescription objectForKey:@"kFilePath"]);
removedMB += [( (NSNumber *)[fileDescription objectForKey:@"kFileSize"] ) floatValue] / 1000.0f / 1000.0f;
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtPath:[fileDescription objectForKey:@"kFilePath"] error:&error];
}
NSLog(@"Removed MB: %f", removedMB);
答案 2 :(得分:-4)
(请仔细阅读)嘿兄弟检查特定应用程序的大小只需按照这些步骤 1开设置 2 - 然后一般 3抽头存储&amp; icloud用法 在这里你看到两件事1-storage和2- icloud都有3个选项 1使用 - 2可用 - 3管理存储 - 您只需点击从存储管理存储,您将看到所有已使用和可用的存储 如果您检查特定应用程序磁带的大小,您将看到此应用程序的大小和数据大小,通常在安装之前从应用商店检查应用程序的大小。 这里也有删除应用程序的选项,如果你点击它,你将删除应用程序以及它还删除的数据