关于 - ios当前应用程序存储的2个问题

时间:2016-11-17 11:57:43

标签: ios

我读了很多关于它的信息,做了一些测试并得到了错误的结果,我觉得我错过了什么。 我得到的唯一信息,这是正确的信息: DEVICE可用空间/总空间。

但我只需要有关我的APP的信息。所以:

  1. 如何获取iOS应用程序的存储大小。 显示在设置上。 (不是其他应用程序,当前的应用程序)
  2. 如何删除所有缓存的/ tmp / other文件,因此存储大小与首次安装时的大小相同?
  3. 感谢。

3 个答案:

答案 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管理存储 - 您只需点击从存储管理存储,您将看到所有已使用和可用的存储 如果您检查特定应用程序磁带的大小,您将看到此应用程序的大小和数据大小,通常在安装之前从应用商店检查应用程序的大小。 这里也有删除应用程序的选项,如果你点击它,你将删除应用程序以及它还删除的数据