我正在尝试逐行复制其他文本文件中的文本文件。似乎有1024个字符的缓冲区。如果我的文件中的字符少于1024个,我的功能将不会复制到另一个文件中。
此外,如果字符数超过1024但因数不足1024,则不会复制这些超出的字符。
前:
初始文件中的2048个字符 - 复制了2048个
初始文件中有988个字符 - 0复制
初始文件中的1256个字符 - 1024个复制
private void button3_Click(object sender, EventArgs e)
{
// écrire code pour reprendre le nom du fichier sélectionné et
//ajouter un suffix "_poly.txt"
string ma_ligne;
const int RMV_CARCT = 9;
//délcaration des fichier
FileStream apt_file = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
textBox1.Text = textBox1.Text.Replace(".txt", "_mod.txt");
FileStream mdi_file = new FileStream(textBox1.Text, FileMode.OpenOrCreate,FileAccess.ReadWrite);
//lecture/ecriture des fichiers en question
StreamReader apt = new StreamReader(apt_file);
StreamWriter mdi_line = new StreamWriter(mdi_file, System.Text.Encoding.UTF8, 16);
while (apt.Peek() >= 0)
{
ma_ligne = apt.ReadLine();
//if (ma_ligne.StartsWith("GOTO"))
//{
// ma_ligne = ma_ligne.Remove(0, RMV_CARCT);
// ma_ligne = ma_ligne.Replace(" ","");
// ma_ligne = ma_ligne.Replace(",", " ");
mdi_line.WriteLine(ma_ligne);
//}
}
apt_file.Close();
mdi_file.Close();
}
答案 0 :(得分:6)
两个问题:
FileStream
,StreamWriter
和StreamReader
类应位于using { }
块内。他们实施IDisposable
,因此您需要调用Dispose
,而using
块会为您执行此操作。如果你这样做,那就是你必须解决的问题(我将在一分钟内解释)。这样做也意味着您不再需要致电Close()
。mdi_line.Flush()
。这将导致缓冲区立即写入文件。在Dispose
班级上呼叫StreamWriter
会自动调用Flush
,这就是using
阻止解决问题的原因。
using (FileStream apt_file = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read))
{
textBox1.Text = textBox1.Text.Replace(".txt", "_mod.txt");
using (FileStream mdi_file = new FileStream(textBox1.Text, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
//lecture/ecriture des fichiers en question
using (StreamReader apt = new StreamReader(apt_file))
using (StreamWriter mdi_line = new StreamWriter(mdi_file, System.Text.Encoding.UTF8, 16))
{
while (apt.Peek() >= 0)
{
ma_ligne = apt.ReadLine();
//if (ma_ligne.StartsWith("GOTO"))
//{
// ma_ligne = ma_ligne.Remove(0, RMV_CARCT);
// ma_ligne = ma_ligne.Replace(" ","");
// ma_ligne = ma_ligne.Replace(",", " ");
mdi_line.WriteLine(ma_ligne);
//}
}
}
}
}
答案 1 :(得分:2)
你知道,有File.Copy() - 方法吗?而FileInfo has a Copy() - 方法也是如此 编辑:我发现您希望在复制期间修改文件内容,尽管现在已经注释掉了。
有关StreamReader的用法,您可以查看msdn documentation。它建议没有Peek()
:
using (StreamReader sr = new StreamReader("TestFile.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
答案 2 :(得分:1)
你想要的:
using (StreamReader apt= new StreamReader(apt_file))
{
while (apt.Peek() > -1){ ...}
}
请参阅:http://msdn.microsoft.com/en-us/library/system.io.streamreader.peek.aspx
答案 3 :(得分:0)
您可以使用ReadLine() method这样读取文件:
using (StreamReader sr = new StreamReader(inputFile))
{
String line;
while ((line = sr.ReadLine()) != null)
{
// process line
}
}
答案 4 :(得分:0)
如何将缓冲区自己和apt.ReadBlock()放入缓冲区。然后拆分缓冲内容上的\ r \ n,处理拆分数组中的行。不要处理分割缓冲区中的最后一行,将其添加到下一个ReadBlock,重复冲洗。