我想知道我的字节数组在回车时结束了,如果不是,我想添加它。
这就是我尝试过的东西
byte[] fileContent = File.ReadAllBytes(openFileDialog.FileName);
byte[] endCharacter = fileContent.Skip(fileContent.Length - 2).Take(2).ToArray();
if (!(endCharacter.Equals(Encoding.ASCII.GetBytes(Environment.NewLine))))
{
fileContent = fileContent.Concat(Encoding.ASCII.GetBytes(Environment.NewLine)).ToArray();
}
但我不明白......这是正确的做法吗?如果是这样,平等有什么问题?即使我的字节数组以{10,13}结尾,If语句也永远不会检测到它。
答案 0 :(得分:3)
在这种情况下,Equals
检查引用相等性;虽然endCharacter
和Encoding.ASCII.GetBytes(Environment.NewLine)
可能具有相同的内容,但它们不是同一个数组,因此Equals
会返回false
。
您对 value 相等感兴趣,因此您应该单独比较数组中每个位置的值:
newLine = Encoding.ASCII.GetBytes(Environment.NewLine);
if (endCharacter[0] != newLine[0] && endCharacter[1] != newLine[1])
{
// ...
}
通常,如果要比较数组的值相等,可以使用Marc Gravell提供的this method之类的内容。
但是,对您的问题更有效的解决方案是将文件的最后两个字节转换为ASCII并进行字符串比较(因为System.String
已经重载==
以检查值是否相等):
string endCharacter = Encoding.ASCII.GetString(fileContent, fileContent.Length - 2, 2);
if (endCharacter == Environment.NewLine)
{
// ...
}
如果整个文件可能很大,您可能还需要小心将其读入内存。如果您不需要文件的全部内容,则可以通过读取最后两个字节,检查它们并根据需要直接附加到文件来更有效地执行此操作。这可以通过为文件打开System.IO.FileStream
来实现(通过System.IO.File.Open
)。
答案 1 :(得分:0)
我找到了解决方案,我必须使用SequenceEqual(http://www.dotnetperls.com/sequenceequal)代替Equals。谢谢大家!
byte[] fileContent = File.ReadAllBytes(openFileDialog.FileName);
byte[] endCharacter = fileContent.Skip(fileContent.Length - 2).Take(2).ToArray();
if (!(endCharacter.SequenceEqual(Encoding.ASCII.GetBytes(Environment.NewLine))))
{
fileContent = fileContent.Concat(Encoding.ASCII.GetBytes(Environment.NewLine)).ToArray();
File.AppendAllText(openFileDialog.FileName, Environment.NewLine);
}