Files
dnf-utils/sgutil/sgu_mode_gen_rand_file.cpp
2025-09-01 20:47:58 +08:00

60 lines
1.6 KiB
C++

#include "sgu_stdafx.h"
#include "sgu_mode_gen_rand_file.h"
#include "sgu_utils.h"
bool generateRandomFile(size_t minSize, size_t maxSize, const char* outputFilename)
{
if (!outputFilename || !*outputFilename) {
printf("Error: Output filename is not specified.\n");
return false;
}
if (minSize > maxSize) {
printf("Error: Min size cannot be greater than max size.\n");
return false;
}
if (maxSize - minSize >= 2ULL * 1024ULL * 1024ULL * 1024ULL) {
printf("Error: Size range is too large(>2GB). Please specify a smaller range.\n");
return false;
}
size_t fileSize = randomInRange(minSize, maxSize);
FILE* file = nullptr;
fopen_s(&file, outputFilename, "wb");
if (!file) {
printf("Error: Cannot open output file %s for writing.\n", outputFilename);
return false;
}
const size_t kMaxBufSize = 1 * 1024 * 1024; // 1 MB
uint8_t* buffer = new uint8_t[kMaxBufSize];
if (!buffer) {
fclose(file);
printf("Error: Memory allocation failed for buffer.\n");
return false;
}
size_t remainSize = fileSize;
while (remainSize > 0)
{
size_t chunkSize = (remainSize > kMaxBufSize) ? kMaxBufSize : remainSize;
// Fill the buffer with random data
fillRandomData(buffer, chunkSize);
// Write the buffer to the file
if (fwrite(buffer, 1, chunkSize, file) != chunkSize)
{
fclose(file);
delete[] buffer;
printf("Error: Failed to write to output file %s.\n", outputFilename);
return false;
}
remainSize -= chunkSize;
}
fclose(file);
delete[] buffer;
printf("Random file generated successfully: %s (%s)\n", outputFilename, sizeToString(fileSize).c_str());
return true;
}