1

我有一个配置文件 (.cfg),用于创建命令行应用程序以将用户添加到 SFTP 服务器应用程序。

cfg 文件需要为 cfg 文件中的每个条目保留一定数量的保留字节。我目前只是通过创建一个字节数组并将其转换为字符串,然后将其复制到文件中来将一个新用户附加到文件的末尾,但我遇到了一个障碍。配置文件在文件末尾需要 4 个字节。

我需要完成的过程是从文件中删除这些尾随字节,附加新用户,然后将字节附加到末尾。

因此,现在您已经了解了我的问题背后的一些背景。

这是问题:

如何从字节数组中删除和添加字节?

这是我到目前为止的代码,它从一个文件中读取用户并将其附加到另一个文件中。

static void Main(string[] args)
        {
            System.Text.ASCIIEncoding code = new System.Text.ASCIIEncoding();     //Encoding in ascii to pick up mad characters
            StreamReader reader = new StreamReader("one_user.cfg", code, false, 1072);

            string input = "";
            input = reader.ReadToEnd();

            //convert input string to bytes
            byte[] byteArray = Encoding.ASCII.GetBytes(input);
            MemoryStream stream = new MemoryStream(byteArray);

            //Convert Stream to string
            StreamReader byteReader = new StreamReader(stream);
            String output = byteReader.ReadToEnd();
            int len = System.Text.Encoding.ASCII.GetByteCount(output);

            using (StreamWriter writer = new StreamWriter("freeFTPdservice.cfg", true, Encoding.ASCII, 5504))
            {
                writer.Write(output, true);
                writer.Close();
            }

            Console.WriteLine("Appended: " + len);
            Console.ReadLine();
            reader.Close();
            byteReader.Close();
        }

为了尝试说明这一点,这里有一个“图表”。

1) 添加第一个用户

文件(附加文本)末尾的字节数(零)

2) 添加第二个用户

文件(附加文本)(附加文本)末尾字节(零)

等等。

4

2 回答 2

4

明确回答您的问题:如何从字节数组中删除和添加字节?

您只能通过创建一个新数组并将字节复制到其中来做到这一点。

幸运的是,这可以通过使用来简化Array.Resize()

byte[] array = new byte[10];
Console.WriteLine(array.Length); // Prints 10
Array.Resize(ref array, 20);     // Copies contents of old array to new.
Console.WriteLine(array.Length); // Prints 20

如果您需要从头开始删除字节 - 首先是Array.Copy字节然后调整大小(或者如果您不喜欢,则复制到新数组ref):

// remove 42 bytes from beginning of the array, add size checks as needed
Array.Copy(array, 42, array, 0, array.Length-42);
Array.Resize(ref array, array.Length-42);   
于 2013-07-23T10:17:07.990 回答
1

你没有。您可以复制到所需大小的新数组。或者您可以使用 a List<byte>,然后从中创建一个数组。

但是,在您的情况下,我建议您自己查看文件流......它们让您可以读取和写入单个字节或字节数组,并且:

这使您可以移动到文件中的任意位置...因此,对于您描述的用例,您将

  • 打开文件(用于读/写访问)
  • 移动到文件末尾
  • 向后移动四个字节(你知道它们是哪些吗?如果不知道,这将是存储它们的好时机)
  • 写新用户
  • 写四个字节
  • 关闭文件

像这样的东西:

using (var fs = new FileStream(PATH, FileMode.Open, FileAccess.ReadWrite))
{
    fs.Seek(-4, SeekOrigin.End);
    fs.Write(userBytes);
    fs.Write(fourBytesAtEnd);      
}

这还具有不必在整个文件中啜饮并将其写回的优点。

于 2013-07-23T09:28:51.777 回答