【问题标题】:I cant copy files using FileStream我无法使用 FileStream 复制文件
【发布时间】:2014-08-29 11:55:31
【问题描述】:

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

【问题讨论】:

  • 怎么了File.Copy?此外,您的代码存在严重错误,您没有处理FileStream,您不关心异常..
  • 使用using 或至少关闭流。

标签: c#


【解决方案1】:

当使用流时,你应该使用'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 方法会更简单。

编辑:另外......当您的文件很大时,将原始文件完全加载到字节数组中可能会导致一些额外的问题。 缓冲区用于从原始文件中读取块并处理它们。 我刚刚更正了您的代码以使其正常工作......但它远非完美。

【讨论】:

    【解决方案2】:

    我会按照这些思路做一些事情:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2019-06-27
      • 1970-01-01
      • 2019-12-15
      相关资源
      最近更新 更多