2014-01-31 26 views
0

我想知道我的字节数组在结尾回车,如果不是,我想添加它。如何检查一个字节数组是否以回车符结束

那是什么我都试过

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

多大的文件,我们在谈论 –

+0

不是一个大的,我觉得主要是<20KB,但我想读取的文件在一个byte [],因为我以后想一个数字签名追加到它。 – Nelly

回答

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

在这种情况下,Equals检查引用相等;而endCharacterEncoding.ASCII.GetBytes(Environment.NewLine)可能具有相同的内容,它们不是相同的数组,因此Equals返回false

你感兴趣平等的,所以你应该不是分别值在阵列中的每个位置比较:

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

嗨,谢谢你的回答。所以我看到我明白了等于错了。只为一次使用数组比较创建额外的函数对我来说没有意义。另一种方式(通过字符串)可以正常工作。但如果有另一种方式:if(!(endCharacter.SequenceEqual(Encoding.ASCII.GetBytes(Environment.NewLine)))){...} – Nelly

+0

你是对的 - 我忘记了'SequenceEqual' :) –

相关问题