在 C# 中生成 1 MB(或 n MB)文本文件
Generate 1 MB (or n MB) text file in C#
我需要创建一个文本文件(字母数字),其大小(精确或接近)以 MB 为单位等于我输入的数字,例如 1 MB。我试图生成一个字符串,认为一个字符是 16 位或 2 字节,所以:
1KB = 1024 字节 = 1024 x 8 位 = 1024 x 8 / 16 个字符 = 512 个字符。
但是生成的文件似乎不太正确:(
如果我生成字节数组并将其写入文件,则大小非常正确!
public static void generateDummyFileBySize(long sizeInMb, string filePath) {
byte[] data = new byte[sizeInMb * 1024 * 1024];
Random rng = new Random();
rng.NextBytes(data);
File.WriteAllBytes(filePath, data);
}
请帮帮我。这是我用来生成文本文件的代码
public static String generateStringSize(long sizeByte)
{
StringBuilder sb = new StringBuilder();
Random rd = new Random();
/**
* Byte -> Bit -> Divide by 16 to num of char
* */
var numOfChars = sizeByte * 8 ;
string allows = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int maxIndex = allows.Length - 1;
for (int i = 0; i < numOfChars; i++)
{
int index = rd.Next(maxIndex);
char c = allows[index];
sb.Append(c);
}
return sb.ToString();
}
public static void generateTextFileBySize(long size, string fileName)
{
long sizeOld = size;
try
{
String s;
String path = Directory.GetCurrentDirectory();
var physicPath = path + Path.DirectorySeparatorChar + fileName;
File.Delete(physicPath);
if (size <= MAX_SIZE)
{
s = StringUtil.generateStringSize(size);
Console.WriteLine("Generated a string with length " + size);
File.WriteAllText(physicPath, s, Encoding.UTF8);
}
else
{
while (size > MAX_SIZE)
{
s = StringUtil.generateStringSize(MAX_SIZE);
Console.WriteLine("Appending " + MAX_SIZE + " to file");
File.AppendAllText(physicPath, s, Encoding.UTF8);
size -= MAX_SIZE;
}
s = StringUtil.generateStringSize(size);
File.AppendAllText(physicPath, s, Encoding.UTF8);
}
Console.WriteLine("Created file named " + fileName + " with size " + sizeOld + " bytes.");
}
catch (Exception ex)
{
Console.WriteLine("Error when generating file");
Console.WriteLine(ex.Message);
}
}
问题出在这里:
var numOfChars = sizeByte * 8 ;
您创造了八倍于您需要的角色。而只是使用
var numOfChars = sizeByte;
您使用的每个字符在存储为 UTF-8 时占用一个字节,因此您不需要使用与您想要的字节数不同的字符数。
对您的代码进行了以下更改:
从 var numOfChars = sizeByte*8;
中删除了 8
,因为在 ASCII encoding
中,每个 character
都是 1 byte
也将编码更改为 ASCII instead of UTF8
对字符精确。
以下是工作代码,生成精确的 1 MB 文件,我测试了其他值,如 8 MB、7 MB,结果是准确的
String s = generateStringSize(1024 * 1024);
File.WriteAllText("D:\Test1.txt", s, Encoding.ASCII);
我需要创建一个文本文件(字母数字),其大小(精确或接近)以 MB 为单位等于我输入的数字,例如 1 MB。我试图生成一个字符串,认为一个字符是 16 位或 2 字节,所以: 1KB = 1024 字节 = 1024 x 8 位 = 1024 x 8 / 16 个字符 = 512 个字符。 但是生成的文件似乎不太正确:( 如果我生成字节数组并将其写入文件,则大小非常正确!
public static void generateDummyFileBySize(long sizeInMb, string filePath) {
byte[] data = new byte[sizeInMb * 1024 * 1024];
Random rng = new Random();
rng.NextBytes(data);
File.WriteAllBytes(filePath, data);
}
请帮帮我。这是我用来生成文本文件的代码
public static String generateStringSize(long sizeByte)
{
StringBuilder sb = new StringBuilder();
Random rd = new Random();
/**
* Byte -> Bit -> Divide by 16 to num of char
* */
var numOfChars = sizeByte * 8 ;
string allows = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int maxIndex = allows.Length - 1;
for (int i = 0; i < numOfChars; i++)
{
int index = rd.Next(maxIndex);
char c = allows[index];
sb.Append(c);
}
return sb.ToString();
}
public static void generateTextFileBySize(long size, string fileName)
{
long sizeOld = size;
try
{
String s;
String path = Directory.GetCurrentDirectory();
var physicPath = path + Path.DirectorySeparatorChar + fileName;
File.Delete(physicPath);
if (size <= MAX_SIZE)
{
s = StringUtil.generateStringSize(size);
Console.WriteLine("Generated a string with length " + size);
File.WriteAllText(physicPath, s, Encoding.UTF8);
}
else
{
while (size > MAX_SIZE)
{
s = StringUtil.generateStringSize(MAX_SIZE);
Console.WriteLine("Appending " + MAX_SIZE + " to file");
File.AppendAllText(physicPath, s, Encoding.UTF8);
size -= MAX_SIZE;
}
s = StringUtil.generateStringSize(size);
File.AppendAllText(physicPath, s, Encoding.UTF8);
}
Console.WriteLine("Created file named " + fileName + " with size " + sizeOld + " bytes.");
}
catch (Exception ex)
{
Console.WriteLine("Error when generating file");
Console.WriteLine(ex.Message);
}
}
问题出在这里:
var numOfChars = sizeByte * 8 ;
您创造了八倍于您需要的角色。而只是使用
var numOfChars = sizeByte;
您使用的每个字符在存储为 UTF-8 时占用一个字节,因此您不需要使用与您想要的字节数不同的字符数。
对您的代码进行了以下更改:
从 var numOfChars = sizeByte*8;
中删除了 8
,因为在 ASCII encoding
中,每个 character
都是 1 byte
也将编码更改为 ASCII instead of UTF8
对字符精确。
以下是工作代码,生成精确的 1 MB 文件,我测试了其他值,如 8 MB、7 MB,结果是准确的
String s = generateStringSize(1024 * 1024);
File.WriteAllText("D:\Test1.txt", s, Encoding.ASCII);