今天测试那边需要测试一种异常情况,需要让iPhone的手机存储空间占满,网上没找到好的方法,于是就自己尝试了下,遇到一些坑在这里记录一下。
把手机空间占满,第一个想到的就是使用文件复制的方法,将APP内的文件复制直到占满空间。
测试的时候,发现代码一直在复制操作,丝毫没有停下来的意思。然后再去手机系统中查看,发现了可怕的事情。如下图:
图片1
后面去stackoverflow上问了下,大概的原因是,iOS中复制文件时,并不是真的复制,而只是增加索引,导致存储空间并不能真正被占满。
原问题
接下来,就想到使用真正写入文件的方式,我使用的方式是直接将一个字符串写入到文件中,直到文件占满。
测试时,又发现,每次获取到的剩余空间也不准确,导致会一直复制。
获取剩余空间的代码如下:
/**
* 手机剩余存储空间大小,单位为M,查询失败返回-1
*
* @return 单位Mb
*/
+ (NSInteger)freeFileStorageSize
{
NSError *error = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];
if (dictionary) {
NSNumber *freeSizeObj = [dictionary objectForKey:NSFileSystemFreeSize];
return [freeSizeObj unsignedLongLongValue] * 1.0 / 1024.0 / 1024.0;
}
UVILog(@"get phone free storage size failed, error:%@", error);
return -1;
}
最终只能通过点击一次按钮,创建一定大小的文件的方法来曲线救国,实现将手机占满的需求。
在这个过程中,还有两个问题有没想明白:
1、在写入文件时,内存占用会快速升高,导致内存占用过高,但写入完成后会很快降下来。如正常情况下手机占用50M,但在复制时会迅速升高到900M,然后又很快降回50M。
写入的代码如下:
+ (void)writeUselessFileToPath:(NSString *)filePath content:(NSString *)content
{
NSFileManager *fileManager = [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:filePath]) //如果不存在
{
[content writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
for (int i = 0; i < 100; i++) {
[fileHandle seekToEndOfFile]; //将节点跳到文件的末尾
NSData* stringData = [content dataUsingEncoding:NSUTF8StringEncoding];
[fileHandle writeData:stringData]; //追加写入数据
}
[fileHandle closeFile];
}
2、将空间占满后,打开设置,然后等一会,再打开设置,看到的剩余内存是不一样的。如占满后显示1.0G,过一会打开又显示3.0G。
使用三方的APP看剩余内存时,显示一直没变。
使用的APP是系统监控。
网友评论