将文件逐行复制到另一个文件的正确方法?
Proper way to copy a file line by line to another file?
我需要打开一个文件,读取一行,如果该行符合某些条件,则将其写入另一个文件,我正在读取的行是一个普通的 ASCII 字符串,表示 HEX 值,我需要将其粘贴到作为 HEX 值而不是 ASCII 字符串的新文件。
我的是这样的:
private void Button_Click(object sender, RoutedEventArgs e)
{
byte[] arrayByte = { 0x00 };
var linesToKeep = File.ReadLines(fileName).Where(l => l.Contains(":10"));
foreach (string line in linesToKeep)
{
string partialA = line.Substring(9);
string partialB = partialA.Remove(partialA.Length - 2);
arrayByte = ToByteArray(partialB);
using (var stream = new FileStream(fileName+"_gugggu", FileMode.OpenOrCreate))
{
FileInfo file = null;
file = new FileInfo(fileName + "_gugggu");
stream.Position = file.Length;
stream.Write(arrayByte, 0, arrayByte.Length);
}
}
}
public static byte[] ToByteArray(String HexString)
{
int NumberChars = HexString.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
{
bytes[i / 2] = Convert.ToByte(HexString.Substring(i, 2), 16);
}
return bytes;
}
这种方法可以满足我的需要,但需要很长时间才能完成,原始文件大约有 70000 行...有没有更好的方法来提高速度?
如评论中所述,您实际上一直在打开和关闭目标文件。您对源文件中的每一行都执行此操作,这会导致巨大且不必要的开销。
每次从源文件中读取一行时,无需关闭、重新打开和重新设置流位置。
我创建了一个包含 316240 行的文件。下面的代码读取,确定要保留的行,然后将它们写入目标文件。由于我无法访问您的源文件,因此我使用了某种字符串到字节的转换模型。
结果:
如您所见,它在 1/3 秒内完成。
代码:
private Stopwatch sw = new Stopwatch();
private FileInfo _sourceFile = new FileInfo(@"D:\source.txt");
private FileInfo _destinationFile = new FileInfo(@"D:\destination.hex");
private void ConvertFile()
{
sw.Start();
using (var streamReader = new StreamReader(_sourceFile.OpenRead()))
{
using (var streamWrite = _destinationFile.OpenWrite())
{
while (!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
if (line.Contains(" x"))
{
var array = ToByteArray(line);
streamWrite.Write(array, 0, array.Length);
}
}
}
}
sw.Stop();
MessageBox.Show("Done in " + sw.Elapsed);
}
private byte[] ToByteArray(string hexString)
{
return hexString.ToList().ConvertAll(c => Convert.ToByte(c)).ToArray();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
ConvertFile();
}
HTH
我需要打开一个文件,读取一行,如果该行符合某些条件,则将其写入另一个文件,我正在读取的行是一个普通的 ASCII 字符串,表示 HEX 值,我需要将其粘贴到作为 HEX 值而不是 ASCII 字符串的新文件。
我的是这样的:
private void Button_Click(object sender, RoutedEventArgs e)
{
byte[] arrayByte = { 0x00 };
var linesToKeep = File.ReadLines(fileName).Where(l => l.Contains(":10"));
foreach (string line in linesToKeep)
{
string partialA = line.Substring(9);
string partialB = partialA.Remove(partialA.Length - 2);
arrayByte = ToByteArray(partialB);
using (var stream = new FileStream(fileName+"_gugggu", FileMode.OpenOrCreate))
{
FileInfo file = null;
file = new FileInfo(fileName + "_gugggu");
stream.Position = file.Length;
stream.Write(arrayByte, 0, arrayByte.Length);
}
}
}
public static byte[] ToByteArray(String HexString)
{
int NumberChars = HexString.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
{
bytes[i / 2] = Convert.ToByte(HexString.Substring(i, 2), 16);
}
return bytes;
}
这种方法可以满足我的需要,但需要很长时间才能完成,原始文件大约有 70000 行...有没有更好的方法来提高速度?
如评论中所述,您实际上一直在打开和关闭目标文件。您对源文件中的每一行都执行此操作,这会导致巨大且不必要的开销。
每次从源文件中读取一行时,无需关闭、重新打开和重新设置流位置。
我创建了一个包含 316240 行的文件。下面的代码读取,确定要保留的行,然后将它们写入目标文件。由于我无法访问您的源文件,因此我使用了某种字符串到字节的转换模型。
结果:
如您所见,它在 1/3 秒内完成。
代码:
private Stopwatch sw = new Stopwatch();
private FileInfo _sourceFile = new FileInfo(@"D:\source.txt");
private FileInfo _destinationFile = new FileInfo(@"D:\destination.hex");
private void ConvertFile()
{
sw.Start();
using (var streamReader = new StreamReader(_sourceFile.OpenRead()))
{
using (var streamWrite = _destinationFile.OpenWrite())
{
while (!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
if (line.Contains(" x"))
{
var array = ToByteArray(line);
streamWrite.Write(array, 0, array.Length);
}
}
}
}
sw.Stop();
MessageBox.Show("Done in " + sw.Elapsed);
}
private byte[] ToByteArray(string hexString)
{
return hexString.ToList().ConvertAll(c => Convert.ToByte(c)).ToArray();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
ConvertFile();
}
HTH