C#基础知识之FileStream
一、FileStream的基础知识
属性:
CanRead判断当前流是否支持读取,返回bool值,True表示可以读取
CanWrite判断当前流是否支持写入,返回bool值,True表示可以写入
方法:
Read()从流中读取数据,返回字节数组
Write()将字节块(字节数组)写入该流
Seek()设置文件读取或写入的起始位置
Flush()清除该流缓冲区,使得所有缓冲的数据都被写入到文件中
Close()关闭当前流并释放与之相关联的所有系统资源
文件的访问方式:(FileAccess)
FileAccess.Read(对文件读访问)
FileAccess.Write(对文件进行写操作)
FileAccess.ReadWrite(对文件读或写操作)
文件打开模式:(FileMode)包括6个枚举
FileMode.Append打开现有文件准备向文件追加数据,只能同FileAccess.Write一起使用
FileMode.Create指示操作系统应创建新文件,如果文件已经存在,它将被覆盖
FileMode.CreateNew指示操作系统应创建新文件,如果文件已经存在,将引发异常
FileMode.Open指示操作系统应打开现有文件,打开的能力取决于FileAccess所指定的值
FileMode.OpenOrCreate指示操作系统应打开文件,如果文件不存在则创建新文件
FileMode.Truncate指示操作系统应打开现有文件,并且清空文件内容
文件共享方式:(FileShare)
FileShare方式是为了避免几个程序同时访问同一个文件会造成异常的情况。
文件共享方式包括四个:
FileShare.None谢绝共享当前文件
FileShare.Read充许别的程序读取当前文件
FileShare.Write充许别的程序写当前文件
FileShare.ReadWrite充许别的程序读写当前文
二、FileStream的异步操作
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.Threading;
namespaceStreamWin
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
stringfilePaths=@"E:\Test\Test\local\a.txt";
stringfileName="a.txt";
System.IO.FileInfof=newFileInfo(@"E:\Test\Test\server\a.txt");
intfileLength=Convert.ToInt32(f.Length.ToString());
ThreadPool.SetMaxThreads(100,100);
using(System.IO.FileStreamstream=newSystem.IO.FileStream(filePaths,FileMode.Create,FileAccess.Write,FileShare.Write,1024,true))
{
for(inti=0;i<fileLength;i+=100*1024)
{
intlength=(int)Math.Min(100*1024,fileLength-i);
varbytes=GetFile(fileName,i,length);
stream.BeginWrite(bytes,0,length,newAsyncCallback(Callback),stream);
}
stream.Flush();
}
}
publicstaticbyte[]GetFile(stringname,intstart,intlength)
{
stringfilepath=@"E:\Test\Test\server\a.txt";
using(System.IO.FileStreamfs=newSystem.IO.FileStream(filepath,System.IO.FileMode.Open,System.IO.FileAccess.Read,FileShare.ReadWrite,1024,true))
{
byte[]buffer=newbyte[length];
fs.Position=start;
fs.BeginRead(buffer,0,length,newAsyncCallback(Completed),fs);
returnbuffer;
}
}
staticvoidCompleted(IAsyncResultresult)
{
FileStreamfs=(FileStream)result.AsyncState;
fs.EndRead(result);
fs.Close();
}
publicstaticvoidCallback(IAsyncResultresult)
{
FileStreamstream=(FileStream)result.AsyncState;
stream.EndWrite(result);
stream.Close();
}
}
}