Быстро создать большой файл в системе Windows

245

В том же духе, что и Быстрое создание большого файла в системе Linux , я бы хотел быстро создать большой файл в системе Windows. По большому счету я думаю 5 ГБ. Содержание не имеет значения. Встроенная команда или короткий командный файл предпочтительнее, но я приму заявку, если нет других простых способов.

Ли Риффель
источник

Ответы:

399
fsutil file createnew <filename> <length>

где <length>в байтах.

fsutil требует административных привилегий, хотя.

Патрик Кафф
источник
6
@ZXX +1 Для моих целей мне просто нужно было, чтобы файловая система видела пространство как недоступное, но ваша информация будет полезна, если кому-то еще это понадобится.
Ли Риффель
22
fsutil file createnew не создает разреженный файл.
За Милднер
7
"fsutil sparse setflag temp.txt" устанавливает флаг разрежения, делая его разреженным файлом. «fsutil sparse setrange temp.txt 0 1024» устанавливает диапазон разреженности :)
Coldblackice
есть ли способ без прав администратора?
wizlog
3
@ZXX fsutil file createnewНЕ создает разреженные файлы:c:\>fsutil file createnew test.txt 0x100000 File c:\test.txt is created c:\>fsutil sparse queryflag test.txt This file is NOT set as sparse
ivan_pozdeev
36

Вы можете использовать инструмент Sysinternals Contig . Он имеет -nпереключатель, который создает новый файл заданного размера. В отличие от этого fsutil, он не требует административных привилегий.

детеныш
источник
2
Вот Это Да! Очень быстро скачать и запустить. Я использовал следующую строку: m: \ contig -n M: \ SpaceBuffer.tmp 5368709120
Ли Риффель,
6
Просто хотите проверить, является ли это разреженным файлом или в самом файле есть данные?
Slolife
2
Это не редкий файл (насколько я знаю), и файл пуст.
Джои
1
Я запутался здесь ... если это мгновенно, и это не редкий файл, то как он на самом деле занимает место на диске?
Джейсон С
2
@JasonS: contigфактически идет к последнему байту и записывает туда один 0(просто посмотрите на Process Monitor). Затем Windows заполняет все остальные нулями. Вероятно, это примерно так же эффективно, как вы можете получить с не разреженными файлами, а создание файла размером около 5 ГБ занимает всего несколько секунд даже на моем жестком диске. Я думаю, тогда я пробовал либо на SSD или с меньшими файлами. Но это довольно быстро (и определенно быстрее, чем писать все байты пустого файла самостоятельно.
Joey
23

Я искал способ создания больших файлов с данными, а не только разреженных файлов. Наткнулся на приведенную ниже технику :

Если вы хотите создать файл с реальными данными, вы можете использовать приведенный ниже скрипт командной строки.

echo "This is just a sample line appended to create a big file.. " > dummy.txt
for /L %i in (1,1,14) do type dummy.txt >> dummy.txt

(Выполните две вышеуказанные команды одну за другой или вы можете добавить их в командный файл.)

Приведенные выше команды создают файл размером 1 МБ dummy.txt в течение нескольких секунд ...

Гири
источник
6
Извлечение по ссылке выше: Если вы хотите создать файл с реальными данными, вы можете использовать приведенный ниже скрипт командной строки. echo "This is just a sample line appended to create a big file.. " > dummy.txt for /L %i in (1,1,14) do type dummy.txt >> dummy.txt (Выполните две вышеуказанные команды одну за другой или вы можете добавить их в командный файл.) Вышеуказанные команды создают файл dummy.txt размером 1 МБ в течение нескольких секунд.
Тони Старк
Внимание: сначала необходимо скопировать первую строку, нажать Enter и затем скопировать вторую строку. Я попытался скопировать весь скрипт в свою оболочку, но потом ничего не случилось.
Magiranu
15

Проверьте RDFC http://www.bertel.de/software/rdfc/index-en.html

RDFC, вероятно, не самый быстрый, но он выделяет блоки данных. Абсолютно быстрым будет использование низкоуровневого API, чтобы просто получить цепочки кластеров и поместить их в MFT без записи данных.

Остерегайтесь, что здесь нет серебряной пули - если «создание» возвращается мгновенно, это означает, что у вас есть разреженный файл, который просто подделывает большой файл, но вы не получите блоки данных / цепочки, пока не напишите в него. Если вы просто прочитаете, вы получите очень быстрые нули, которые могут заставить вас поверить, что ваш диск внезапно стал невероятно быстрым :-)

ZXX
источник
Это кажется лучшим ответом. FSUTIL создает разреженный файл, который во многих случаях не является допустимым сценарием тестирования. Sysinternals contig никогда не работает для меня, когда я использую команду типа "contig -n largefile.bin 6000000000, он создает файл размером 1,7 ГБ ... ??? Спасибо за RDFC, потому что он отлично работал с первой попытки и пишет в максимальная скорость записи моего диска ATA
Syclone0044
Как было сказано выше, FSUTIL «createnew» НЕ создает разреженные файлы, он просто выделяет (в MFT) запрошенное пространство для запрошенного файла, то есть полное пространство. Если затем вы проверяете свойства файла, выделенный размер (досадно называемый «размер на диске», как это может быть на любом устройстве, которое не обязательно является «диском») будет аналогичным или очень близким к фактическому размеру. Реальный разреженный файл, полностью заполненный нулями, будет иметь очень маленький выделенный размер. Единственный инструмент, который я нашел, который может превратить не разреженный файл в разреженный файл (и фактически уменьшить его размер, а не просто пометить его), это SparseTest.
GabrielB
13

Проверьте средства набора ресурсов Windows Server 2003 . Есть утилита под названием Creatfil.

 CREATFIL.EXE
 -? : This message
 -FileName -- name of the new file
 -FileSize -- size of file in KBytes, default is 1024 KBytes

Это похоже на mkfile на Solaris.

Байрон Уитлок
источник
1
Я бы предпочел не загружать комплект ресурсов.
Ли Риффель
вам потребуется только 1 exe из комплекта ресурсов, вам не нужно иметь все это в вашей производственной системе.
Байрон Уитлок
1
Я попробую, но я бы предпочел не иметь дополнительной зависимости от файла.
Ли Риффель
Сейчас файл загружается неправильно, но я не могу представить, что он работает быстрее, чем инструмент Contig, упомянутый Йоханнесом Росселем.
Ли Риффель
1
Спасибо! Загруженный пакет - rktools.exe, его размер составляет 11,7 МБ и 18,2 МБ при расширении. О, и это "creatfil.exe", а не "createfil.exe". Один этот файл имеет размер 5,5 КБ, и это все, что вам действительно нужно. Мне понадобилось менее 1 минуты, чтобы сгенерировать файл размером 1 ГБ на четырехъядерном процессоре Intel с тактовой частотой 3,0 ГГц. С помощью инструмента fsutil.exe, как описано выше, его создание занимает всего лишь долю секунды. Так что это правда, этот инструмент создает разреженные файлы. Это еще больше, это 73,5 КБ. Этот лучше для создания больших файлов для целей тестирования.
Самир
11

Мне нужен был обычный файл размером 10 ГБ для тестирования, поэтому я не мог его использовать, fsutilпоскольку он создает разреженные файлы (спасибо @ZXX).

@echo off

:: Create file with 2 bytes
echo.>file-big.txt

:: Expand to 1 KB
for /L %%i in (1, 1, 9) do type file-big.txt>>file-big.txt

:: Expand to 1 MB
for /L %%i in (1, 1, 10) do type file-big.txt>>file-big.txt

:: Expand to 1 GB
for /L %%i in (1, 1, 10) do type file-big.txt>>file-big.txt

:: Expand to 4 GB
del file-4gb.txt
for /L %%i in (1, 1, 4) do type file-big.txt>>file-4gb.txt

del file-big.txt

Я хотел создать файл размером 10 ГБ, но по какой-то причине он показывал только 4 ГБ, поэтому я хотел быть в безопасности и остановился на 4 ГБ. Если вы действительно хотите быть уверенным, что операционная система и другие приложения будут правильно обрабатывать ваш файл, прекратите расширять его до 1 ГБ.

f.ardelian
источник
Вам нужно использовать один символ процента, а не двойной. Кроме того, вам не нужны лишние пробелы в скобках. Я отредактирую это для вас.
Самир
Какую операционную систему вы использовали здесь, приятель? Это rmкоманда Unix / Linux, а команда delDOS / Windows? ...
Самир
Это должен быть командный файл или вы должны вводить эти команды прямо в cmd? Одиночный знак процента используется в cmd, как, %iно в пакетном файле вы используете двойной знак процента, как %%i.
Самир
@ Сэмми: Это начинается с @echo off, так что это очевидно .bat. Вот почему у него были двойные знаки процента.
f.ardelian
Хорошо, тогда мы могли бы вернуть двойной знак процента. Почему вы удаляете его file-4gb.txtперед созданием? Не приведет ли это к ошибке? Вы действительно хотели создать file-4gb.txtна этой линии? Или переименовать старый file-big.txtфайл? Это неясно даже для командного файла. Если вы хотели переименовать его, то, вероятно, вам нужна команда ren. Как ren file-big.txt file-4gb.txt. Я думаю, что вы перепутали это с rm.
Самир
7

Откройте диспетчер задач Windows, найдите самый большой процесс, который у вас запущен, щелкните правой кнопкой мыши и нажмите Create dump file.

Это создаст файл относительно размера процесса в памяти во вашей временной папке.

Вы можете легко создать файл размером в гигабайты.

Введите описание изображения здесь

Введите описание изображения здесь

shenku
источник
2
отличное решение! Полезно, если у вас запущено множество приложений, чтобы получить разные размеры
Дон Чидл
6

Если не считать полноценного приложения, мы, ребята из Python, можем получить файлы любого размера с четырьмя строками, одним и тем же фрагментом в Windows и Linux (эта os.stat()строка - просто проверка):

>>> f = open('myfile.txt','w')
>>> f.seek(1024-1) # an example, pick any size
>>> f.write('\x00')
>>> f.close()
>>> os.stat('myfile.txt').st_size
1024L
>>>
гимель
источник
1
Установка Python для решения одной проблемы действительно излишня. Почему бы просто не использовать что-то встроенное, такое как Powershell или C # - gist.github.com/nadams810/6539070 (вам даже не нужна Visual Studio для компиляции приложений C #).
Натали Адамс
1
.Net, C # и Powershell не обязательно являются кроссплатформенными.
Гимел
1
Они встроены в Windows, о чем просит OP (при условии, что ваша система полностью обновлена).
Натали Адамс
@NatalieAdams Но этот ответ является весьма полезным , если у вас уже есть Python установлен для решения других задач. :)
criptych выступает с Моникой
6

PowerShell с одним вкладышем для создания файла C:\Tempна диске C: осталось всего 10 МБ:

[io.file]::Create("C:\temp\bigblob.txt").SetLength((gwmi Win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace - 10MB).Close
прут
источник
3
это создаст файл с некоторым реальным содержанием или разреженным файлом?
Самсельвапрабу
6

Использование:

/*
Creates an empty file, which can take all of the disk
space. Just specify the desired file size on the
command line.
*/

#include <windows.h>
#include <stdlib.h>

int main (int argc, char* ARGV[])
{
    int size;
    size = atoi(ARGV[1]);
    const char* full = "fulldisk.dsk";
    HANDLE hf = CreateFile(full,
                           GENERIC_WRITE,
                           0,
                           0,
                           CREATE_ALWAYS,
                           0,
                           0);
    SetFilePointer(hf, size, 0, FILE_BEGIN);
    SetEndOfFile(hf);
    CloseHandle(hf);
    return 0;
}
lkurts
источник
Что такое int? Будет ли это работать для файла 5 ГБ? Это ограничено 2 или 4 ГБ? Третий параметр, SetFilePointer()равный 0, предполагает, что он не будет работать для файла объемом 5 ГБ.
Питер Мортенсен
4

Я недавно искал способ создать большой фиктивный файл с распределением пространства. Все решения выглядят неловко. Наконец, я только запустил DISKPARTутилиту в Windows (встроенная начиная с Windows Vista):

DISKPART
CREATE VDISK FILE="C:\test.vhd" MAXIMUM=20000 TYPE=FIXED

Где MAXIMUM - размер результирующего файла, здесь 20 ГБ.

chersun
источник
Лучшее решение на данный момент.
Франк FYC
Не работает для меня К сожалению, файл не создан. Я пытался с администратором привилегий.
Magiranu
4

Я нашел отличную утилиту, которую можно настроить по адресу https://github.com/acch/genfiles .

Он заполняет целевой файл случайными данными, поэтому проблем с разреженными файлами не возникает, и для моих целей (тестирование алгоритмов сжатия) он дает хороший уровень белого шума.

MusikPolice
источник
Эта утилита представляет собой однофайловое Java-приложение, которое должно работать на любой платформе с Java.
Пол
@MusikPolice - ссылка мертва
dcp
Принято к сведению. К сожалению, это должно произойти через шесть лет.
MusikPolice
3

Временные файлы должны храниться в папке временных файлов Windows. Основываясь на ответе Рода, вы можете использовать следующую строку для создания временного файла объемом 5 ГБ, который возвращает имя файла

[System.IO.Path]::GetTempFileName() | % { [System.IO.File]::Create($_).SetLength(5gb).Close;$_ } | ? { $_ }

Объяснение:

  • [System.IO.Path]::GetTempFileName() генерирует случайное имя файла со случайным расширением в папке Temp Windows
  • Конвейер используется для передачи имени, для [System.IO.File]::Create($_)которого создается файл.
  • Имя файла устанавливается на вновь созданный файл с помощью .SetLength(5gb). Я был немного удивлен, обнаружив, что PowerShell поддерживает преобразование байтов , что действительно полезно.
  • Дескриптор файла должен быть закрыт, .closeчтобы другие приложения могли получить к нему доступ
  • При ;$_этом возвращается имя файла и при | ? { $_ }этом гарантируется, что возвращается только имя файла, а не пустая строка, возвращаемая[System.IO.File]::Create($_)
Флориан Фельдхаус
источник
3

Самый простой способ, который я нашел, это бесплатная утилита: http://www.mynikko.com/dummy/

Создает фиктивные файлы произвольного размера, которые либо заполнены пробелами, либо заполнены несжимаемым содержимым (на ваш выбор). Вот скриншот:

введите описание изображения здесь

йош м
источник
3

Простой C '... он построен под MinGW GCC на Windows XX и должен работать на любой' общей 'платформе C.

Он генерирует нулевой файл указанного размера. Результирующий файл НЕ является просто записью, занимающей место в каталоге, и фактически занимает указанное количество байтов. Это быстро, потому что никакие фактические записи не происходят, за исключением байта, записанного перед закрытием.

Мой экземпляр создает файл, полный нулей - это может варьироваться в зависимости от платформы; Эта программа, по сути, устанавливает структуру каталогов для любых данных.

#include <stdio.h>
#include <stdlib.h>

FILE *file;

int main(int argc, char **argv)
{
    unsigned long  size;

    if(argc!=3)
    {
        printf("Error ... syntax: Fillerfile  size  Fname \n\n");
        exit(1);
    }

    size = atoi(&*argv[1]);

    printf("Creating %d byte file '%s'...\n", size, &*argv[2]);

    if(!(file = fopen(&*argv[2], "w+")))
    {
        printf("Error opening file %s!\n\n", &*argv[2]);
        exit(1);
    }

    fseek(file, size-1, SEEK_SET);
    fprintf(file, "%c", 0x00);
    fclose(file);
}
Билл W
источник
Я предлагаю вам проверить, как я отформатировал ваш код. И кстати. вопрос уже имеет очень хороший ответ, и fseek + fwrite уже был представлен в Pyton и WinAPI, так что это мало чем поможет. Это хорошо, однако вы предоставили полный пример. +1 за это. Но постарайтесь не отвечать на уже решенные вопросы, это просто пустая трата времени, в котором вы могли бы помочь кому-то немного больше :)
quetzalcoatl
2

Я нашел решение с помощью DEBUG на http://www.scribed.com/doc/445750/Create-a-Huge-File , но я не знаю простой способ написать его, и он, кажется, не в состоянии создавать файлы размером более 1 ГБ.

Ли Риффель
источник
1
Вы не можете создать 5 файлов, а затем добавить их? Создайте их одновременно с использованием потоков, а затем добавьте их: D
dassouki
Я не знаю, смогу ли я создать поток без программирования, но да, я могу скопировать файл несколько раз, чтобы получить нужный мне размер. В моем случае мне не нужен сам файл размером 5 ГБ, только использованное пространство.
Ли Риффель
2
Запись в несколько файлов с использованием многопоточности звучит как ужасная идея, учитывая, насколько медленны жесткие диски ... Кроме того, их добавление довольно дорого с точки зрения времени, так что, вероятно, не соответствует критериям «быстрого».
Джои
2

Вы можете использовать команду cat powershell.

Сначала создайте простой текстовый файл с несколькими символами. Чем больше начальных символов вы вводите, тем быстрее они становятся больше. Давайте назовем это out.txt. Тогда в Powershell:

cat out.txt >> out.txt

Подождите, пока необходимо сделать файл достаточно большим. Затем нажмите Ctrl-C, чтобы закончить.

Meghdad
источник
1

Вы можете попробовать этот код C ++:

#include<stdlib.h>
#include<iostream>
#include<conio.h>
#include<fstream>
#using namespace std;

int main()
{
    int a;
    ofstream fcout ("big_file.txt");
    for(;;a += 1999999999){
        do{
            fcout << a;
        }
        while(!a);
    }
}

Может потребоваться некоторое время для генерации в зависимости от скорости вашего процессора ...

NEt_Bomber
источник
Постер спросил быстро. Это потребует установки компилятора C ++.
1

Простой ответ на Python: если вам нужно создать большой реальный текстовый файл, я просто использовал простой whileцикл и смог создать файл размером 5 ГБ примерно за 20 секунд. Я знаю, что это грубо, но это достаточно быстро.

outfile = open("outfile.log", "a+")

def write(outfile):
    outfile.write("hello world hello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello world"+"\n")
    return

i=0
while i < 1000000:
    write(outfile)
    i += 1
outfile.close()
jkdba
источник
0

Быстро выполнить или быстро набрать на клавиатуре? Если вы используете Python в Windows, вы можете попробовать это:

cmd /k py -3 -c "with open(r'C:\Users\LRiffel\BigFile.bin', 'wb') as file: file.truncate(5 * 1 << 30)"
Noctis Skytower
источник
0

Другое решение с графическим интерфейсом: WinHex.

“File” > “New” > “Desired file size” = [X]
“File” > “Save as” = [Name]

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

Это также позволяет заполнить новый файл выбранным шаблоном или случайными данными:

“Edit” > “Fill file” (or “Fill block” if a block is selected)
GabrielB
источник
-1

Я сделал несколько дополнений к тому же fsutilметоду, который упоминался в выбранном ответе. Это делается для создания файлов разных расширений и / или разных размеров.

set file_list=avi bmp doc docm docx eps gif jpeg jpg key m4v mov mp4 mpg msg nsf odt pdf png pps ppsx ppt pptx rar rtf tif tiff txt wmv xls xlsb xlsm xlsx xps zip 7z
set file_size= 1
for %%f in (%file_list%) do (
fsutil file createnew valid_%%f.%%f %file_size%
) > xxlogs.txt

Код можно клонировать с https://github.com/iamakidilam/bulkFileCreater.git.

Алан Паллат
источник