我有一个配置文件(.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)添加第二个用户
结尾的文件(附加文本)(附加文本)字节(零)
等等。
答案 0 :(得分: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);
答案 1 :(得分:1)
你没有。您可以复制到所需大小的新数组。或者您可以使用List<byte>
,然后从中创建一个数组。
但是,在您的情况下,我建议您自己查看文件流...它们允许您读取和写入单个字节或字节数组以及:
允许你移动到文件中的任意位置......所以,对于你描述的用例,你会
这样的事情:
using (var fs = new FileStream(PATH, FileMode.Open, FileAccess.ReadWrite))
{
fs.Seek(-4, SeekOrigin.End);
fs.Write(userBytes);
fs.Write(fourBytesAtEnd);
}
这样做的好处是不必在整个文件中啜饮并将其写回。