2013-03-07 119 views
1

我是新來這個社區,並且還新iOS開發,我希望有人能幫助我一點點問題...創建一個大的虛擬文件

目前我正在寫一個小應用程序我自己,這應該創建一個非常大的虛擬文件,虛擬數據或文字或任何它使它很大。

原因是,我想點擊一個按鈕,應用程序應該生成一個4 GB的文件並將其保存到磁盤,沒有其他應用程序可以使用它,因爲它不是免費的...如果我需要4 gb的免費空間,我只需打開我的小應用程序,並在點擊另一個按鈕後,文件將被刪除,並且我有4 GB的免費磁盤空間...

我知道如何將文件寫入磁盤,但我不知道如何在短時間內生成大量的數據,使它成爲4個或更多的大數據?

有人有一個想法如何生成這樣一個大文件與for循環或什麼?

+0

該大文件有什麼用途?爲什麼需要? – 2013-03-07 14:03:21

+0

你能說清楚文件應該包含什麼嗎?只是隨機(可打印)字符?隨機二進制數據?一點都沒有? – trojanfoe 2013-03-07 14:04:02

+0

只是爲了保持一些空間...如果創建的文件其他應用程序不能使用它自己...如果我需要可用空間,我可以刪除該文件,使一些空間免費....我需要這個我自己,解決與其他應用程序的問題...我知道這不會有趣的其他人,但我真的可以需要它.. :-) – 2013-03-07 14:08:48

回答

0

如果做粗略計算了1000,而不是1024

4 gb 
4000 mb 
4000000 kb 
4000000000 b 
32000000000 bits 

而正是這將是34359738368位

如果你去到(ABC等),寫那麼多字的文字文件,按循環,您將創建一個4GB的文件。

+0

是的,但我正在尋找一個更簡單/更好的方法/算法來完成這個工作......我會嘗試c.cams的建議,如果它不工作,我會按照你的方式做... – 2013-03-07 14:16:12

0

您可以創建一個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版將清除您的應用程序的數據在某些目錄如果設備的可用存儲空間不足。

+0

不會佔用4GB的內存呢?這可能會造成問題... – trojanfoe 2013-03-07 14:12:01

+0

我不知道iOS如何處理大的NSData對象 - 不應該有這樣的理由。 – colincameron 2013-03-07 14:13:23

+0

謝謝!我想這正是我正在尋找的....我會在Xcode中測試它...謝謝你的幫助! – 2013-03-07 14:14:32

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贊成因此文件模式可以被指定的open()掉落creat()

而且錯誤檢查應該比出更好的... ...

+1

創建幾個較小的文件可能更有意義,這樣您可以逐漸聲明空間。 – 2013-03-07 14:23:29

+0

@MarcusAdams請問這有什麼區別? – trojanfoe 2013-03-07 14:26:37

+0

這只是OP的建議。你的解決方案很好。這個想法是,如果你想聲稱只有1 GB,你將不得不編寫另一個3 GB的虛擬文件來保留空間。如果您創建四個1 GB文件,則可以逐漸聲明該空間,而不必製作更多虛擬文件。 – 2013-03-07 14:28:51

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綁定的。你可能會想一些真實的數據在那裏有一天,太:)

0

的Windows:

打開命令外殼 - 在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