欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# FileStream简单介绍和使用

程序员文章站 2023-11-01 09:08:52
本章讲述:filestream类的基本功能,以及简单示例; 1、引用命名空间:using system.io; 2、注意:使用io操作文件时,要注意流关闭和释放问题!...

本章讲述:filestream类的基本功能,以及简单示例;

1、引用命名空间:using system.io;

2、注意:使用io操作文件时,要注意流关闭和释放问题!

强力推荐:将创建文件流对象的过程写在using当中,会自动帮助我们释放资源;

使用try{} catch(exception ex){} 进行一次捕获;

3、filestream 操作字节,可以操作任何类型的文件;下面来简单介绍filestream类的方法和参数:

(1)filestream()    作用:创建filestream对象,参数:第一个是路径,第二个是文件模式filemode枚举,第三个数据模式fileacess

filestream(string, filemode):
filestream(string, filemode, fileaccess)
filestream(string, filemode, fileaccess, fileshare)
filestream(string, filemode, fileaccess, fileshare, int32)

初始化filestream时使用包含文件共享属性(system.io.fileshare)的构造函数比使用自定义线程锁更为安全和高效

(2)filemode(以何种方式打开或者创建文件):createnew(创建新文件)、create(创建并覆盖)、open(打开)、openorcreate(打开并创建)、truncate(覆盖文件)、append(追加);

(3)fileacess(文件流对象如何访问该文件):read(只读) 、write(写)、readwirte(读写);

(4)fileshare(进程如何共享文件):none(拒绝共享)、read 、write、readwrite(同时读写)、delete;

(5)buffersize(缓冲区大小设置)

4、stream.read(array<byte[], int32, int32):从流中读取一块字节,并将数据写入给定的缓冲区;

5、stream.write(array<byte[], int32, int32):使用缓冲区中的数据将字节块写入此流;

6、close():关闭当前流并释放与当前流关联的任何资源(如套接字和文件句柄);

7、dispose():释放流所有使用的资源;

8、copyto(stream):从当前流中读取所有字节并将其写入目标流。 

copyto(stream, int32):从当前流中读取所有字节,并使用指定的缓冲区大小将它们写入目标流

9、seek()(filestream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置):将此流的当前位置设置为给定值。(stream.seek(int64,seekorigin)

第一个参数规定文件指针以字节为单位的移动距离。第二个参数规定开始计算的起始位置;seekorigin枚举包含3个值:begin、current 和 end;

例如:afile.seek(0, seekorigin.end);

10、由于设置了文件共享模式为允许随后写入,所以即使多个线程同时写入文件,也会等待之前的线程写入结束之后再执行,而不会出现错误

复制代码 代码如下:
using (filestream logfile = new filestream(logfilepath, filemode.openorcreate, fileaccess.write, fileshare.write))

11、简单示例1:简单文件写入
filestream devstream = new filestream(devpath, filemode.append, fileaccess.write, fileshare.readwrite,512);
devstream.write(data, 0, 128);
 
if(devstream != null)
 devstream.close();

12、简单示例2:以追加的方式写入文件

public static class monitdata
{
 public static string devpath = string.empty;
 private static object objlock = new object();
 public static void writeinfo(byte[] data)
 {
  lock (objlock)
  {
   if (!string.isnullorempty(devpath))
   {
    byte[] bytearray = new byte[128];
    array.copy(data, 0, bytearray, 0, 128);
    if (bytearray != null && bytearray.length == 128)
    {
      using (system.io.filestream fs = system.io.file.openwrite(devpath))
      {
       fs.seek(0, seekorigin.end);
       fs.write(bytearray, 0, bytearray.length);
       fs.close();
       fs.dispose();
      }
    }
   }
  } 
 }
}

13、简单示例:文件流写入

public static void main(string[] args)
{
 string str = @"e:\下载\软件";
 stopwatch sw = new stopwatch();
 sw.start();
 using (filestream fswriter = new filestream(str + @"\opencv-3.0.exe", filemode.create, fileaccess.write))
 {
  using (filestream fsreader = new filestream(str + @"\opencv-2.4.9.exe", filemode.open, fileaccess.read))
  {
   byte[] bytes=new byte[1024*4];//4kb是合适的;
   int readnum;
   while((readnum=fsreader.read(bytes,0,bytes.length))!=0)//小于说明读完了
   {
    fswriter.write(bytes,0,readnum);
    fswriter .flush();//清除缓冲区,把所有数据写入文件中
    fswriter.close();
    fswriter.dispose();
   }
  }
 }
 sw.stop();
 console.writeline("总的运行时间为{0}",sw.elapsedmilliseconds);
 console.readkey();
}

14、简单示例:读取文件

public static string filestreamreadfile(string filepath)
{
 byte[] data = new byte[100];
 char[] chardata = new char[100];
 filestream file = new filestream(filepath, filemode.open);
 //文件指针指向0位置
 file.seek(0, seekorigin.begin);//可以设置第一个参数
 //读入两百个字节
 file.read(data, 0, (int) file.length);
 //提取字节数组
 decoder dec = encoding.utf8.getdecoder();
 dec.getchars(data, 0, data.length, chardata, 0);
 file.close(); 
 file.dispose();
 return convert.tostring(chardata);
}


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。