Генерация случайных файлов в Windows - PullRequest
28 голосов
/ 10 февраля 2009

У кого-нибудь есть способ генерировать файлы случайных данных в Windows? Я хотел бы сгенерировать 50 000 маленьких (2K) файлов в качестве примера.

Ответы [ 13 ]

28 голосов
/ 10 февраля 2009

Вы можете запустить fsutil в пакетном цикле для создания файлов любого размера.

fsutil file createnew filename.extension 2000
15 голосов
/ 27 сентября 2013

Вы можете использовать PowerShell для генерации дешевых случайных данных для ваших файлов:

[Byte[]] $out = @()
0..2047 | % {$out += Get-Random -Minimum 0 -Maximum 255}
[System.IO.File]::WriteAllBytes("myrandomfiletest", $out)

При этом используется алгоритм с начальным числом, взятым из системных часов, поэтому не используйте его для ЛЮБЫХ криптографических приложений.

Кроме того, опасайтесь снижения производительности на Get-Random при увеличении размера выходного файла. Подробнее об этом аспекте здесь:

15 голосов
/ 05 февраля 2010

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

7 голосов
/ 26 сентября 2017

Однострочник в Powershell:

$out = new-object byte[] 1048576; (new-object Random).NextBytes($out); [IO.File]::WriteAllBytes('d:\file.bin', $out)

Это молниеносно по сравнению с решением @ user188737.

5 голосов
/ 10 февраля 2009

Поскольку вы не указываете язык, я просто выберу один наугад. Вот скрипт powershell для этого:

$rootDir = 'C:\Temp\TestRandomFiles\'
$baseFile = $rootDir + "base.txt"
$desiredFileSize = 2*1KB
$fileCount = 50000
"start" | Out-File -Filepath $baseFile
While ($(Get-ChildItem -path $baseFile).Length -lt $desiredFileSize)
{
    $(Get-ChildItem -path $baseFile).Length | Out-File $baseFile -APPEND
}
for($i=1;$i -lt $fileCount;$i++)
{
    Copy-Item $baseFile "File$i.txt"
}

Вам, конечно, придется изменить переменные на те параметры, которые вам нужны.

3 голосов
/ 10 февраля 2009

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

Это действительно зависит от вашего языка программирования. Сама Windows, конечно, не обеспечит эту возможность.

Однако существует ряд языков программирования, которые могут легко это сделать, в том числе базовые сценарии Windows Batch / CMD. На каком языке вы заинтересованы в использовании?

2 голосов
/ 01 апреля 2017

Вместо использования Get-Random для генерации текста в соответствии с рекомендациями user188737 & mguassa, я улучшил скорость, используя GUID.

Function New-RandomFile {
    Param(
        $Path = '.', 
        $FileSize = 1kb, 
        $FileName = [guid]::NewGuid().Guid + '.txt'
        ) 
    (1..($FileSize/128)).foreach({-join ([guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-").SubString(1, 126) }) | set-content "$Path\$FileName"
}

Это заняло 491 миллисекунду, чтобы создать файл 1 МБ. Запуск:

New-RandomFile -FileSize 1mb

UPDATE:

Я обновил свою функцию, чтобы использовать ScriptBlock, чтобы вы могли заменить метод 'NewGuid ()' на что угодно.

В этом сценарии я делаю куски по 1 КБ, поскольку я знаю, что никогда не создаю файлы меньшего размера. Это значительно улучшило скорость моей функции!

Set-Content заставляет NewLine в конце, поэтому вам нужно удалять 2 символа каждый раз, когда вы пишете в файл. Я заменил его на [io.file] :: WriteAllText ().

Function New-RandomFile_1kChunks {
    Param(
        $Path = (Resolve-Path '.').Path, 
        $FileSize = 1kb, 
        $FileName = [guid]::NewGuid().Guid + '.txt'
        ) 

    $Chunk = { [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-" }

    $Chunks = [math]::Ceiling($FileSize/1kb)

    [io.file]::WriteAllText("$Path\$FileName","$(-Join (1..($Chunks)).foreach({ $Chunk.Invoke() }))")

    Write-Warning "New-RandomFile: $Path\$FileName"

}

Если вас не волнует случайность всех фрагментов, вы можете просто вызвать () генерацию фрагмента размером 1 КБ один раз ... это резко повысит скорость, но не сделает весь файл случайным.

Function New-RandomFile_Fast {
    Param(
        $Path = (Resolve-Path '.').Path, 
        $FileSize = 1kb, 
        $FileName = [guid]::NewGuid().Guid + '.txt'
        ) 

    $Chunk = { [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-" }
    $Chunks = [math]::Ceiling($FileSize/1kb)
    $ChunkString = $Chunk.Invoke()

    [io.file]::WriteAllText("$Path\$FileName","$(-Join (1..($Chunks)).foreach({ $ChunkString }))")

    Write-Warning "New-RandomFile: $Path\$FileName"

}

Measure-Command все эти изменения для создания файла 10 Мб:

Выполнение New-RandomFile: 35,7688241 секунд.

Выполнение New-RandomFile_1kChunks: 25,1463777 секунд.

Выполнение New-RandomFile_Fast: 1,1626236 секунд.

1 голос
/ 10 февраля 2009
0 голосов
/ 18 июня 2018

Итак, я решил добавить точный ответ на этот раз.

язык PowerShell. предположения: имена файлов будут последовательными, а не случайными. содержимое файла должно быть криптографически безопасным и уникальным. расположение файла C: \ temp \

#create a fixed size byte array for later use.  make it the required file size.
$bytearray = New-Object byte[] 2048

#create and start a stopwatch object to measure how long it all takes.
$stopwatch = [Diagnostics.Stopwatch]::StartNew()

#create a CSRNG object
$RNGObject = New-Object Security.Cryptography.RNGCryptoServiceProvider

# set up a loop to run 50000 times
0..49999 | Foreach-Object {

    # create a file stream handle with a name format 'filennnnn'
    $stream = New-Object System.IO.FileStream("c:\temp\file$("{0:D5}" -f $_)"), Create

    # and a stream writer handle
    $writer = New-Object System.IO.BinaryWriter($stream)

    # Fill our array from the CSRNG
    $RNGObject.GetNonZeroBytes($bytearray)

    # Append to the current file
    $writer.write($bytearray)

    # Close the stream
    $stream.close()

}

# how long did it all take?
$stopwatch.stop()
$stopwatch

А на выходе:

IsRunning Elapsed          ElapsedMilliseconds ElapsedTicks
--------- -------          ------------------- ------------
False 00:07:53.7685350              473768   1434270755

Ммм, кажется, что это заняло много времени, но

$stopwatch.ElapsedMilliseconds/50000
9.47536

так, это около 10 мс на файл. Это старый диск сата.

0 голосов
/ 18 июня 2018

редактировать

Я перечитал вопрос, следующий ответ не даст ответа (файлы 50x2k) как есть, но создаст файлы произвольного размера с действительно случайными двоичными данными.

Пожалуйста, прокомментируйте, если вы хотите увидеть пример, который точно отвечает на вопрос.

/ редактировать

Следующие файлы могут генерировать 1 ГБ файл криптографически защищенных случайных данных с использованием объектов, доступных в powershell:

#set the size, 1024^3 = 1GB
$size=1024*1024*1024

#as we will build the file 1k at a time, divide required size by 1k
$size/=1024

#now create the byte array of a fixed size
$bytearray=new-object byte[] 1024

#and create a CSRNG object
$RNGObject=new-object Security.Cryptography.RNGCryptoServiceProvider

#Create a file for streaming. PS will overwrite if it exists.
#its probably bad form to hard code the filename, an exercise for you
$stream = New-Object System.IO.FileStream("d:\file1.bin"), Create

#open the stream and grab the handle.
$writer = New-Object System.IO.BinaryWriter($stream)

#create a timer object so we can measure the runtime.  start it.
$stopwatch=[diagnostics.stopwatch]::startnew()

#now, iterate through the required file size 1k at a time
0..($size-1) | Foreach-Object{
    #filling our byte array with random non zero bytes
    $RNGObject.GetNonZeroBytes($bytearray)
    #and them append them to the file stream.
    $writer.write($bytearray)
}

#captain obvious
$stopwatch.stop()
$stream.close()

#and display the stopwatch data
$stopwatch

IsRunning Elapsed          ElapsedMilliseconds ElapsedTicks
--------- -------          ------------------- ------------
False 00:00:23.2019782               23201     70240880

Чтобы использовать случайные данные с нулевыми значениями, просто замените

$RNGObject.GetNonZeroBytes($bytearray)

с

$RNGObject.GetBytes($bytearray)

Краткое введение в duckduckgo, если вы зайдете на duckduckgo.com и выполните поиск с помощью

!msdn Security.Cryptography.RNGCryptoServiceProvider

вам будут предоставлены чрезвычайно сфокусированные результаты непосредственно из Microsoft Developer Network, что позволит вам увидеть доступные классы, методы и свойства Crypto.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...