【问题标题】:Generate 1 MB (or n MB) text file in C#在 C# 中生成 1 MB(或 n MB)文本文件
【发布时间】:2016-11-01 11:25:32
【问题描述】:

我需要创建一个文本文件(字母数字),其大小(精确或近似)以 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);
            }
        }

【问题讨论】:

  • 您在哪里将字符写入文件,例如 Byte[] ?内存和磁盘大小总是存在差异的。
  • 对不起 :) 我添加了代码并更新了问题。事实上,我的尺码从来没有超过 MAX_SIZE,你可以忽略这种情况
  • ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789中的每个字符在utf8编码时占1个字节。
  • 1 个问题是您使用 UTF8 编写它,这是一种可变大小的编码。由于您只使用 ASCII 字符,因此每个字符将使用 1 个字节。
  • 我刚刚测试过,在删除 *8 并提供值 1024*1024 时,您将能够使用编码 ASCII 获得精确的 1 MB 文件

标签: c# unicode text-files dynamically-generated


【解决方案1】:

问题出在这里:

var numOfChars = sizeByte * 8 ;

您可以创建八倍于您需要的角色。相反,只需使用

var numOfChars = sizeByte;

您使用的每个字符在存储为 UTF-8 时占用一个字节,因此您无需使用与所需字节数不同的字符数。

【讨论】:

    【解决方案2】:

    对您的代码进行以下更改:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2020-02-27
      • 2018-08-27
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多