创建一个大的虚拟文件

时间:2013-03-07 13:56:09

标签: ios file nsdata

我是这个社区的新手,也是iOS开发的新手,我希望有人可以帮我解决一个小问题......

目前我正在为自己编写一个小应用程序,它应该创建一个非常大的虚拟文件,带有虚拟数据或单词或任何它使它变大。

原因是,我想点击一个按钮,应用程序应该生成一个4 GB的文件并将其保存到磁盘,没有其他应用程序可以使用它,因为它不是免费的...如果我需要4 GB可用空间,我只需打开我的小应用程序,点击另一个按钮后,该文件将被删除,我有4 GB的可用磁盘空间......

我知道如何将文件写入磁盘,但我不知道如何在短时间内生成大量数据,使其达到4个或更多gb大???

有人知道如何使用for循环或其他东西生成这么大的文件吗?

5 个答案:

答案 0 :(得分:2)

如果你只想占用4GB的磁盘空间,那么创建一个文件,寻求4GB并写一个字节。这将创建一个“稀疏文件”,在接下来的时间内包含几乎没有数据!

这是C:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

...

int fd = open("/path/to/file", O_WRONLY, 0644);
if (fd >= 0)
{
    lseek(fd, 4 * 1024 * 1024 * 1024, SEEK_SET);
    write(fd, &fd, 1);
    close(fd);
}

编辑删除了creat()以支持open(),因此可以指定文件模式。

错误检查也应该比显示的更好......

答案 1 :(得分:1)

您可以创建NSMutableData对象并使用-setLength:将其扩展为4GB。 (-setLength将填入零),然后将其写入文件。

我不确定iOS在处理大型NSMutableData对象方面有多好。

修改:示例:

NSString *filename; // The location to save your file
NSMutableData *data = [[NSMutableData alloc] init];
[data setLength:4*1024*1024*1024];
[data writeToFile:fileName atomically:NO];

请记住,如果设备的可用存储空间不足,iOS将清除某些目录中的应用数据。

答案 2 :(得分:0)

如果粗略计算1000,而不是1024

 4 gb 
 4000 mb
 4000000 kb 
 4000000000 b 
32000000000 bits

确切地说它将是34359738368位

如果你继续将这么多字符(例如b等)写入文本文件,通过循环,你将创建一个4gb的文件。

答案 3 :(得分:0)

你可以用C语言逐步写出来:

// a starting point:
const char path[] = "somewhere";
const size_t NBytesInBuffer = 1024;
/* fill buffer, if you like */
const char buffer[NBytesInBuffer] = {0};
FILE* const file = fopen(path, "w+");
assert(file);
const size_t ElementSize = sizeof(buffer[0]);

uint64_t nBytesWritten = 0;
while (UINT32_MAX > nBytesWritten) {
    nBytesWritten += ElementSize * fwrite(buffer, ElementSize, NBytesInBuffer, file);
}

fclose(file);

内存消耗不会成为问题。当然,编写整个文件需要一些时间,因为它是I / O绑定的。有一天你可能会想要一些真实的数据:)

答案 4 :(得分:0)

视窗:

打开命令shell - cmd 执行以下命令以创建1mb

的文件
fsutil file createnew ./test.tmp 1048576

Linux的:

使用转换和复制命令 - dd

dd if=/dev/zero of=test.tmp bs=1M count=1

OS X&amp;的Solaris:

mkfile 1m test.tmp