protected void DisplayFileInfo(string fileFullName)
{
FileInfo theFile = new FileInfo(fileFullName);
if (!theFile.Exists)
{
throw new FileNotFoundException(“File not found:”+fileFullName);
}
}
public static void SafeRead(Stream stream, byte[] data)
{
int offset = 0;
int remaining = data.Length;
//只要有剩余的字节就不停的读
while (remaining > 0)
{
int read = stream.Read(data, offset, remaining);
if (read <= 0)
{
throw new EndOfStreamException(“文件读取”+read.ToString()+”失败!”);
}
//减少剩余的字节数
remaining -= read;
//增加偏移量
offset += read;
}
}
/*****************
* 有些情况下你不知道流实际的长度比如:网络流。
* 此时可以使用类似的方法读取流直到流里面的数据完全读
* 取出来为止。我们可以先初始化一段缓存,再将流读
* 出来的流信息写到内存流里面,就像下面这样:
* *******************/
public static byte[] ReadFully(Stream stream)
{
//初始化一个32K的缓存
byte[] buffer = new byte[32768];
using (MemoryStream ms = new MemoryStream())
{
//返回结果后会自动回收调用该对象的Dispose 方法释放内存
//不停的读取
while (true)
{
int read = stream.Read(buffer, 0, buffer.Length);
//直接读取完最后的 3M 数据就可以返回结果了
if (read <= 0)
{
return ms.ToArray();
ms.Write(buffer, 0, read);
}
}
}
}
public static byte[] Read2Buffer(Stream stream,int BufferLen)
{
//如果指定的无效长度的缓冲区,则指定一个默认的长度作为缓存大小
if (BufferLen < 1)
{
BufferLen = 0x8000;
}
//初始化一个缓存区
byte[] buffer = new byte[BufferLen];
int read = 0;
int block;
//每次从流中读取缓存大小的数据,直到读取完所有的流为止
while((block=stream.Read(buffer,read,buffer.Length-read))>0){
//重新设定读取位置
read += block;
//检查是否到达了缓存的边界,检查是否还有可以读取的信息
if (read == buffer.Length)
{
//尝试读取一个字节
int nextByte = stream.ReadByte();
//读取失败则说明 读取完成可以返回结果
if (nextByte == -1)
{
return buffer;
}
//调整数组大小 准备继续读取
byte[] newBuf = new byte[buffer.Length*2];
Array.Copy(buffer,newBuf,buffer.Length);
newBuf[read] = (byte)nextByte;
buffer = newBuf; //buffer是一个引用(指针),重新设定 buffer 指针指向一个更大的内存
read++;
}
}
//如果缓存太大 则使用ret 来收缩前面 while 读取的 buffer,然后直接返回
byte[] ret = new byte[read];
Array.Copy(buffer, ret, read);
return ret;
}