Crie rapidamente arquivos grandes em um sistema Windows

245

Na mesma linha que Criar rapidamente um arquivo grande em um sistema Linux , gostaria de criar rapidamente um arquivo grande em um sistema Windows. Em geral, estou pensando em 5 GB. O conteúdo não importa. É preferível um comando interno ou um arquivo em lotes curto, mas aceitarei um aplicativo se não houver outras maneiras fáceis.

Leigh Riffel
fonte

Respostas:

399
fsutil file createnew <filename> <length>

onde <length>está em bytes.

fsutil requer privilégios administrativos.

Patrick Cuff
fonte
6
@ZXX +1 Para meus propósitos, eu apenas precisava do sistema de arquivos para ver o espaço como indisponível, mas suas informações são úteis se alguém mais precisar disso.
Leigh Riffel
22
O arquivo fsutil createnew não cria um arquivo esparso.
Por Mildner
7
"fsutil sparse setflag temp.txt" define o sinalizador esparso, tornando-o um arquivo esparso. "fsutil escassa SetRange temp.txt 0 1024" sets a gama de sparseness :)
Coldblackice
existe um caminho sem privilégios de administrador?
Wizlog 7/08
3
O @ZXX fsutil file createnewNÃO cria arquivos esparsos: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 20/17
36

Você pode usar a ferramenta Sysinternals Contig . Possui uma -nopção que cria um novo arquivo de um determinado tamanho. Ao contrário fsutil, não requer privilégios administrativos.

Joey
fonte
2
Uau! Muito rápido para baixar e executar. A linha que é utilizado m: \ contig -n H: \ SpaceBuffer.tmp 5368709120
Leigh Riffel
6
Só quero verificar se esse é um arquivo esparso ou se o arquivo realmente contém dados?
slolife
2
Não é um arquivo escasso (tanto quanto eu sei) e o arquivo está vazio.
Joey
1
Estou confuso aqui ... se é instantâneo e não é um arquivo esparso, então como ele realmente ocupa espaço em disco?
Jason S
2
@ JasonS: contigefetivamente vai para o último byte e escreve um único 0lá (basta olhar com o Process Monitor). O Windows preenche o restante com zeros. Provavelmente, é tão eficiente quanto você pode obter com arquivos não esparsos e a criação de um arquivo com tamanho de 5 GiB leva apenas alguns segundos, mesmo no meu disco rígido. Acho que naquela época eu tentei em um SSD ou com arquivos menores. Mas é bastante rápido (e definitivamente mais rápido do que escrever todos os bytes do arquivo vazio por si mesmo.
Joey
23

Eu estava procurando uma maneira de gerar arquivos grandes com dados, e não apenas arquivos esparsos. Deparei com a técnica abaixo :

Se você deseja criar um arquivo com dados reais, use o script de linha de comando abaixo.

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

(Execute os dois comandos acima, um após o outro, ou você pode adicioná-los a um arquivo em lotes.)

Os comandos acima criam um arquivo dummy.txt de 1 MB em alguns segundos ...

Giri
fonte
6
Extrair do link acima: Se você deseja criar um arquivo com dados reais, use o script de linha de comando abaixo. 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 (Execute os dois comandos acima, um após o outro, ou você pode adicioná-los a um arquivo em lotes.) Os comandos acima criam um arquivo de 1 MB dummy.txt em alguns segundos.
Tony Stark
Atenção: Você deve copiar a primeira linha primeiro, pressionar Enter e copiar a segunda linha. Tentei copiar o script inteiro para o meu shell, mas nada aconteceu.
Magiranu
15

Confira RDFC http://www.bertel.de/software/rdfc/index-en.html

O RDFC provavelmente não é o mais rápido, mas aloca blocos de dados. O mais rápido seria usar a API de nível inferior para obter cadeias de cluster e colocá-las na MFT sem gravar dados.

Cuidado para não haver uma bala de prata aqui - se a "criação" retornar instantaneamente, significa que você obteve um arquivo esparso que apenas falsifica um arquivo grande, mas você não receberá blocos / cadeias de dados até escrever nele. Se você acabou de ler, obteria zeros muito rápidos, o que poderia fazer você acreditar que sua unidade de repente ficou incrivelmente rápida :-)

ZXX
fonte
Esta parece ser a melhor resposta. O FSUTIL cria um arquivo esparso que não é um cenário de teste válido para muitos casos. O Sysinternals contig nunca parece funcionar para mim, quando eu uso um comando como "contig -n largefile.bin 6000000000, ele cria um arquivo com 1,7 GB de tamanho ... ??? Obrigado pelo RDFC porque ele funcionou perfeitamente na primeira tentativa e escreve em a velocidade máxima de gravação do meu disco ATA.
Syclone0044
Como foi dito acima, o FSUTIL “createnew” NÃO cria arquivos esparsos, apenas aloca (na MFT) o espaço solicitado para o arquivo solicitado, ou seja, o espaço total. Se você verificar as propriedades do arquivo, o tamanho alocado (irritantemente chamado "tamanho no disco", como pode ser em qualquer dispositivo que não seja necessariamente um "disco") é semelhante ou muito próximo ao tamanho real. Um arquivo esparso real totalmente preenchido com zeros teria um tamanho alocado muito pequeno. A única ferramenta que encontrei que pode transformar um arquivo não esparso em um arquivo esparso (e reduzir seu tamanho, não apenas sinalizá-lo) é o SparseTest.
GabrielB
13

Verifique as ferramentas do Windows Server 2003 Resource Kit . Existe um utilitário chamado Creatfil.

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

É semelhante ao mkfile no Solaris.

Byron Whitlock
fonte
1
Prefiro não ter que baixar o kit de recursos.
21330 Leigh Riffel
você precisaria apenas o 1 exe do kit de recursos, não precisa ter tudo em seu sistema de produção.
Byron Whitlock
1
Vou tentar, mas prefiro não ter a dependência de arquivo adicional.
21330 Leigh Riffel
O arquivo não está sendo baixado corretamente agora, mas não consigo imaginar que seja mais rápido que a ferramenta Contig mencionada por Johannes Rossel.
21330 Leigh Riffel
1
Obrigado! O pacote baixado é rktools.exe e tem 11,7 MB e 18,2 MB quando expandido. Ah, e isso é "creatfil.exe" e não "createfil.exe". Somente esse arquivo tem 5,5 KB de tamanho e é tudo o que você realmente precisa. Levei menos de 1 minuto para gerar um arquivo de 1 GB em um processador Intel quad core de 3,0 GHz. Com a ferramenta fsutil.exe, conforme postada acima, leva apenas uma fração de segundo para criá-la. Portanto, é verdade que essa ferramenta cria arquivos esparsos. É ainda maior, tem 73,5 KB. Este é melhor para gerar arquivos grandes para fins de teste.
Samir
11

Eu precisava de um arquivo regular de 10 GB para teste, então não pude usá- fsutillo porque ele cria arquivos esparsos (obrigado @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

Eu queria criar um arquivo de 10 GB, mas por algum motivo ele apareceu apenas com 4 GB, então eu queria estar seguro e parado com 4 GB. Se você realmente deseja ter certeza de que seu arquivo será tratado adequadamente pelo sistema operacional e outros aplicativos, pare de expandi-lo em 1 GB.

f.ardelian
fonte
Você precisa usar um único caractere de porcentagem, não o dobro. Além disso, você não precisa de espaços extras entre parênteses. Vou editar isso para você.
Samir
Qual sistema operacional você usou aqui, companheiro? O rmé um comando Unix / Linux, enquanto delé um comando DOS / Windows ...?
Samir
Isso deveria ser um arquivo em lotes ou você deveria emitir esses comandos diretamente no cmd? O sinal de porcentagem único é usado no cmd, como %iem um arquivo em lote, você usa o sinal de porcentagem duplo %%i.
Samir
@ Sammy: Começa com @echo off, então é obviamente um .bat. É por isso que tinha sinais de porcentagem duplos.
precisa saber é o seguinte
Tudo bem, então podemos querer trazer de volta o duplo sinal de porcentagem. Por que você exclui file-4gb.txtantes de criá-lo? Isso não resultaria em erro? Você realmente quis criar file-4gb.txtnessa linha? Ou renomear o file-big.txtarquivo antigo ? Isso não está claro, mesmo para um arquivo em lotes. Se você pretendia renomeá-lo, provavelmente o comando que estava procurando ren. Like ren file-big.txt file-4gb.txt. Eu acho que você confundiu isso rm.
Samir
7

Abra o Gerenciador de tarefas do Windows, encontre o maior processo em execução, clique com o botão direito do mouse e clique em Create dump file .

Isso criará um arquivo relativo ao tamanho do processo na memória na sua pasta temporária.

Você pode criar facilmente um arquivo dimensionado em gigabytes.

Digite a descrição da imagem aqui

Digite a descrição da imagem aqui

shenku
fonte
2
boa solução! Útil se você tem uma variedade de aplicações em execução, para obter tamanhos diferentes
Don Cheadle
6

Antes de escrever um aplicativo completo, nós, pessoal do Python, podemos obter arquivos de qualquer tamanho com quatro linhas, o mesmo trecho no Windows e Linux (a os.stat()linha é apenas uma verificação):

>>> 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
>>>
gimel
fonte
1
Instalar o Python para resolver um problema é realmente um exagero. Por que não usar apenas algo incorporado como o Powershell ou C # - gist.github.com/nadams810/6539070 (você nem precisa do Visual Studio para compilar aplicativos C #).
Natalie Adams
1
.Net, C # e Powershell não são necessariamente multiplataforma.
guimel
1
Eles são integrados ao Windows, o que o OP solicitou (assumindo que seu sistema esteja totalmente atualizado).
Natalie Adams
@NatalieAdams Mas esta resposta é bastante útil se você já tiver o Python instalado para resolver outros problemas. :)
criptych fica com Monica
6

Linha única do PowerShell para criar um arquivo C:\Temppara preencher o disco C: deixando apenas 10 MB:

[io.file]::Create("C:\temp\bigblob.txt").SetLength((gwmi Win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace - 10MB).Close
Cajado
fonte
3
criará um arquivo com algum conteúdo real ou arquivo esparso?
Samselvaprabu
6

Usar:

/*
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
fonte
O que é int? Isso funcionará para um arquivo de 5 GB? Isso é limitado a 2 ou 4 GB? Que o terceiro parâmetro para SetFilePointer()é 0 sugere que não funcionará para um arquivo de 5 GB.
Peter Mortensen
4

Eu estava procurando uma maneira de criar um arquivo fictício grande com alocação de espaço recentemente. Todas as soluções parecem estranhas. Finalmente, iniciei o DISKPARTutilitário no Windows (incorporado desde o Windows Vista):

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

Onde MÁXIMO é o tamanho do arquivo resultante, 20 GB aqui.

chersun
fonte
Melhor solução até agora.
precisa
Não funciona para mim. Infelizmente, nenhum arquivo foi criado. Eu tentei com privilégios de administrador.
Magiranu
4

Encontrei um excelente utilitário configurável em https://github.com/acch/genfiles .

Ele preenche o arquivo de destino com dados aleatórios, para que não haja problemas com arquivos esparsos e, para meus propósitos (teste de algoritmos de compressão), fornece um bom nível de ruído branco.

MusikPolice
fonte
Este utilitário é um aplicativo Java de arquivo único que deve funcionar em qualquer plataforma com Java.
Paul
@MusikPolice - O link está morto
dcp
Notado. Infelizmente, isso deve acontecer depois de seis anos.
MusikPolice 19/09/19
3

Arquivos temporários devem ser armazenados na pasta Temp do Windows. Com base na resposta de Rod, você pode usar o seguinte liner para criar um arquivo temporário de 5 GB que retorna o nome do arquivo

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

Explicação:

  • [System.IO.Path]::GetTempFileName() gera um nome de arquivo aleatório com extensão aleatória na pasta Temp do Windows
  • O Pipeline é usado para passar o nome ao [System.IO.File]::Create($_)qual cria o arquivo
  • O nome do arquivo é definido como o arquivo recém-criado com .SetLength(5gb). Fiquei um pouco surpreso ao descobrir que o PowerShell suporta Byte Conversion , o que é realmente útil.
  • O identificador de arquivo precisa ser fechado .closepara permitir que outros aplicativos acessem
  • Com ;$_o nome do arquivo é retornado e com | ? { $_ }isso é garantido que apenas o nome do arquivo seja retornado e não a string vazia retornada por[System.IO.File]::Create($_)
Florian Feldhaus
fonte
3

A maneira mais simples que encontrei é este utilitário gratuito: http://www.mynikko.com/dummy/

Cria arquivos fictícios de tamanho arbitrário preenchidos com espaços ou preenchidos com conteúdo não compactável (sua escolha). Aqui está uma captura de tela:

insira a descrição da imagem aqui

yosh m
fonte
3

Plain ol 'C ... isso é desenvolvido no MinGW GCC no Windows XX e deve funcionar em qualquer plataforma C' genérica '.

Ele gera um arquivo nulo de um tamanho especificado. O arquivo resultante NÃO é apenas uma entrada de ocupante de espaço no diretório e, de fato, ocupa o número especificado de bytes. Isso é rápido porque nenhuma gravação real ocorre, exceto o byte gravado antes do fechamento.

Minha instância produz um arquivo cheio de zeros - isso pode variar de acordo com a plataforma; este programa essencialmente configura a estrutura de diretórios para quaisquer dados que estejam por aí.

#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);
}
Bill W
fonte
Eu sugiro que você verifique como eu formatei seu código. E BTW. a pergunta já tem uma resposta muito boa e o fseek + fwrite já foi apresentado em Pyton e WinAPI, portanto, isso é de pouca ajuda. É bom, no entanto, você forneceu um exemplo completo. +1 para isso. Mas tente questões não re-resposta já resolvidos, é apenas desperdício de tempo em que você poderia ajudar alguém um pouco mais :)
quetzalcoatl
2

Encontrei uma solução usando o DEBUG em http://www.scribd.com/doc/445750/Create-a-Huge-File , mas não conheço uma maneira fácil de criar um script e não parece ser capaz para criar arquivos maiores que 1 GB.

Leigh Riffel
fonte
1
você não pode criar 5 arquivos e anexá-los? Criá-los simultaniously usando threading, e depois anexá-los: D
dassouki
Não sei se poderia encadear sem fazer programação, mas sim, posso copiar o arquivo algumas vezes para obter o tamanho necessário. No meu caso, não preciso que o arquivo tenha 5 GB, apenas o espaço usado.
21330 Leigh Riffel
2
Gravar em vários arquivos usando o threading parece uma péssima idéia, considerando o quão lento os discos rígidos são ... Além disso, anexá-los é bastante caro em termos de tempo, de modo que provavelmente falha nos critérios "rápidos".
Joey
2

Você pode usar o comando cat powershell.

Primeiro, crie um arquivo de texto simples com alguns caracteres. Quanto mais caracteres iniciais você digitar, mais rápido ele ficará maior. Vamos chamar de out.txt. Então, em Powershell:

cat out.txt >> out.txt

Aguarde o tempo necessário para tornar o arquivo grande o suficiente. Em seguida, pressione ctrl-c para finalizar.

Meghdad
fonte
1

Você pode tentar este código 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);
    }
}

Talvez demore algum tempo para gerar, dependendo da velocidade da CPU ...

NEt_Bomber
fonte
O cartaz perguntou rapidamente. Isso exigiria a instalação de um compilador C ++.
1

Resposta simples em Python: se você precisar criar um grande arquivo de texto real, usei um whileloop simples e consegui criar um arquivo de 5 GB em cerca de 20 segundos. Eu sei que é bruto, mas é rápido o suficiente.

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
fonte
0

Rápido para executar ou rápido para digitar em um teclado? Se você usa o Python no Windows, pode tentar o seguinte:

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

Outra solução GUI: WinHex.

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

Ao contrário de algumas das soluções já propostas, ele realmente grava os dados (vazios) no dispositivo.

Também permite preencher o novo arquivo com um padrão selecionável ou dados aleatórios:

“Edit” > “Fill file” (or “Fill block” if a block is selected)
GabrielB
fonte
-1

Fiz algumas adições ao mesmo fsutilmétodo mencionado na resposta escolhida. Isso é para criar arquivos de várias extensões diferentes e / ou de vários tamanhos.

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

O código pode ser clonado em https://github.com/iamakidilam/bulkFileCength.git

Alan Pallath
fonte