复制一个文件的基本思路是:逐一读取原文件流的字节,逐一写入新文件流中。分别用到文件流的ReadByte()和WriteByte()方法。这里要注意的是,读取时以字节为单位,一个字节如下图所示
是一个0和1组合的序列。ReadByte()读取一个字节后将这个序列求值,返回的是整形数值。如果读到文件的尽头了,不能成功读取字节了,返回的是-1。这个设计是非常合理的。因为只要是个字节,总是能求出它大于或等于0的值的。没有字节了,就返回-1了。这样的话,可以把-1作为循环读取终止的标志。
我下面以一个图片文件的复制为例讲解。
在C盘新建一个画图文件,另存为png格式,文件名pic1。
然后执行以下代码:
using System;
using System.IO;
namespace Demo
{
class Program {
public static void Main(string[] args)
{
FileStream fs1 = new FileStream("c:/pic1.png",FileMode.Open);//FileAccess is dispensable.
//FileAccess is the extra contract.
FileStream fs2 = new FileStream("c:/pic2.png",FileMode.Create);
int d;
byte b;
while( ( d = fs1.ReadByte() ) != -1 )
{
b = (byte)d;
fs2.WriteByte( b );
}
fs1.Close();
fs2.Close();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
会在c盘下生成一个和pic1一模一样的图片文件pic2.