2012-09-12 46 views
0

我正在写一个filecopy程序,但是从二进制模式下的媒体文件(如.avi)读取数据到字符串变量str中会引发与变量str的大小相关的错误不够大保存从读取的文件返回的数据。 这是我试图执行任务的代码。在二进制模式下的文件复制程序

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
namespace ConsoleApplication7 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string filename; 
      Console.WriteLine("enter file location"); 
      filename=Console.ReadLine(); 
      FileStream fs = new FileStream(filename, FileMode.Open); 
      BinaryReader br = new BinaryReader(fs); 
      string str; 
      str =Convert.ToString(br.Read()); 
      while (str != null) 
      { 
       Console.WriteLine(str); 
       str = Convert.ToString(br.Read()); 
      } 
      fs.Close(); 
      br.Close(); 
     } 
    } 
} 

这是什么解决方案。

+1

为什么你要将数据读入字符串而不是比如说byte []? – David

+5

您可以直接使用[File.Copy](http://msdn.microsoft.com/zh-cn/library/system.io.file.copy(VS.71).aspx) – Default

回答

4

如果您正在讨论二进制,请不要涉及string。因此,除非控制台处于二进制模式,否则写入控制台没什么意义。一个基本的二进制复制循环将是这样的:

using(var inputStream = OpenSomeStream()) { 
    byte[] buffer = new byte[8192]; 
    int read; 
    while((read = inputStream.Read(buffer, 0, buffer.Length)) > 0) { 
     // TODO: write "read"-many bytes from buffer 
    } 
} 

然而,对于流至流拷贝,这可以简写为:

using(var inputStream = OpenSomeStream()) 
using(var outputStream = OpenSomeOtherStream()) { 
    inputStream.CopyTo(outputStream); 
} 

这样:以写入stdout,这将是:

using(var inputStream = File.OpenRead(filename)) 
using(var outputStream = Console.OpenStandardOutput()) { 
    inputStream.CopyTo(outputStream); 
}