我正在尝试使用FileStream
读取/写入文件。代码正在运行但复制文件后,我得到一个空文件。不复制文件中的字符串数据。
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{
FileStream streamR = new FileStream(openFileDialog1.FileName, FileMode.Open);
byte[] buffer = new byte[streamR.Length];
streamR.Read(buffer, 0, buffer.Length);
FileStream streamW = new FileStream(saveFileDialog1.FileName,FileMode.Create);
int read_byte = 0;
while ((read_byte = streamR.Read(buffer, 0, buffer.Length)) > 0)
{
streamW.Write(buffer, 0, read_byte);
}
}
}
答案 0 :(得分:2)
使用流时,您应该使用'using'命令:
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{
using (FileStream streamR = new FileStream(openFileDialog1.FileName, FileMode.Open))
{
using (FileStream streamW = new FileStream(saveFileDialog1.FileName,FileMode.Create))
{
byte[] buffer = new byte[streamR.Length];
int read_byte = 0;
while ((read_byte = streamR.Read(buffer, 0, buffer.Length)) > 0)
{
streamW.Write(buffer, 0, read_byte);
}
}
}
}
}
它将自动为您冲洗,关闭和处理流。 实际上阻止你的代码工作的是flush()和close()命令。 但是,仍然建议使用'using'命令。
第二种方法是将所有内容包装在try finally块中并将流处理到finally块中: using statement FileStream and / or StreamReader - Visual Studio 2012 Warnings
无论如何,我建议在继续之前阅读有关流的更多信息。 另一方面......如果只是复制文件,使用Fil.Copy方法会更简单。
编辑:另外......当文件非常大时,将原始文件完全加载到字节数组中会导致一些额外的问题。 缓冲区用于从原始文件中读取块并处理它们。 我刚刚更正了你的代码以使它工作......但它远非完美。
答案 1 :(得分:0)
我会沿着这些方向做点什么:
if (openFileDialog1.ShowDialog() == DialogResult.OK
&& saveFileDialog1.ShowDialog() == DialogResult.OK){
try {
if (File.Exists(saveFileDialog1.FileName)) {
File.Delete(saveFileDialog1.FileName);
}
File.Copy(openFileDialog1.FileName, saveFileDialog1.FileName);
} catch (Exception e){
//handle or throw e
}
}