2

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

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

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

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

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

4

5 回答 5

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

EDIT放弃creat()了,open()因此可以指定文件模式。

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

于 2013-03-07T14:11:22.480 回答
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 将清除您应用程序在某些目录中的数据。

于 2013-03-07T14:06:16.067 回答
1

你可以用 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 绑定的。有一天你可能也想要一些真实的数据:)

于 2013-03-07T14:12:56.770 回答
1

视窗:

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

fsutil file createnew ./test.tmp 1048576

Linux:

使用转换和复制命令 - dd

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

OS X 和 Solaris:

mkfile 1m test.tmp
于 2015-12-15T20:28:37.297 回答
0

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

 4 gb 
 4000 mb
 4000000 kb 
 4000000000 b 
32000000000 bits

确切地说它将是 34359738368 位

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

于 2013-03-07T14:04:49.247 回答