我无法使用FileStream复制文件

时间:2014-08-29 11:55:32

标签: c#

我正在尝试使用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);
        }
    }
}

2 个答案:

答案 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
    }
}