2013-03-07 2 views
1

Я новичок в это сообщество, а также новый для развития IOS, и я надеюсь, что кто-то может помочь мне с небольшой проблемой ...Создание большого Dummy File

В настоящее время я пишу небольшое приложение для я должен создать очень большой фиктивный файл с фиктивными данными или словами или тем, что делает его большим.

Причина в том, что я хотел бы нажать кнопку, и приложение должно сгенерировать файл размером 4 ГБ и сохранить его на диск, чтобы никакое другое приложение не могло его использовать, потому что оно не бесплатное ... Если мне нужно 4 gb свободного пространства, мне просто нужно открыть мое маленькое приложение, и после нажатия другой кнопки файл будет удален, и я получил 4 ГБ свободного дискового пространства ...

Я знаю, как писать файлы на диск, но Я не знаю, как сгенерировать большой объем данных за короткое время, чтобы сделать его 4 или более gb большим ???

Есть ли у кого-нибудь идеи, как создать такой большой файл с циклом for или что-то в этом роде?

+0

Какую цель бы, что большой файл есть? Зачем это нужно? –

+0

Можете ли вы прояснить, что должен содержать файл? Просто случайные (печатные) символы? случайные двоичные данные? Ничего? – trojanfoe

+0

просто для того, чтобы сохранить свободное пространство ... если файл создан, другие приложения не могут использовать его для себя ... если мне нужно свободное пространство, я могу удалить файл, чтобы сделать свободное пространство ... Мне нужно это для сам, чтобы решить проблему с другими приложениями ... Я знаю, что это было бы не интересно для кого-то другого, но мне это действительно нужно. :-) –

ответ

0

Если вы делаете грубый расчет на 1000, а не 1024

4 gb 
4000 mb 
4000000 kb 
4000000000 b 
32000000000 bits 

И именно это будет 34359738368 биты

И если вы продолжаете писать, что много символов (азбуки и т.д.) в текст файл, по циклу, вы создадите файл 4gb.

+0

Да, но я искал более простой/лучший метод/алгоритм, чтобы это сделать ... Я попробую совет c.cams, если он не работает, я сделаю это по-своему ... –

0

Вы можете создать объект NSMutableData и использовать -setLength:, чтобы развернуть его до 4 ГБ. (-setLength будет заполняться нулями), прежде чем записывать его в файл.

Я не уверен, насколько хорошо iOS справится с объектом NSMutableData, который большой, однако.

Edit: Пример:

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

Не будет занимать 4 ГБ памяти? Это может быть проблематично ... – trojanfoe

+0

Я не знаю, как iOS справляется с большими объектами NSData - не должно быть мыслимых причин для этого. – colincameron

+0

Спасибо! Я думаю, это было именно то, что я искал ... Я проверю его в Xcode ... Спасибо за вашу помощь !!! –

2

Если вы просто хотите заняться 4 ГБ дискового пространства, тогда создайте файл, найдите 4 ГБ и напишите байт. Это приведет к созданию «редкого файла», содержащего данные, имеющиеся рядом с отсутствующим в ближайшее время!

Это 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() поэтому режим файла может быть указан.

Также проверка ошибок должна быть лучше, чем показано ...

+1

Возможно, имеет смысл создать несколько меньших файлов, чтобы вы могли требовать пространство пошагово. –

+0

@MarcusAdams Будет ли это иметь значение? – trojanfoe

+0

Это было всего лишь предложение для ОП. Ваше решение в порядке. Идея состоит в том, что если вы хотите требовать всего 1 ГБ, вам нужно будет написать еще 3-гигабайтный фиктивный файл, чтобы сохранить зарезервированное пространство. Если вы создадите четыре файла размером 1 ГБ, вы можете требовать пространство поэтапно, не создавая больше фиктивных файлов. –

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

Окна:

Откройте командную оболочку - CMD Выполните следующую команду, чтобы создать файл 1Мб

fsutil file createnew ./test.tmp 1048576 

Linux:

Использование преобразования и копирования команды - д.д.

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

OS X & Solaris:

mkfile 1m test.tmp