网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

用C#读写文件的方法

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

通常我们读取一个文件使用如下的步骤:

1、声明并使用File的OpenRead实例化一个文件流对象,就像下面这样

2、准备一个存放文件内容的字节数组,fs.Length将得到文件的实际大小,就像下面这样

3、开始读了,调用一个文件流的一个方法读取数据到data数组中

  1. FileStream fs = File.OpenRead(filename); 或者 
  2.  
  3. FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); 
  4.  
  5. byte data = new byte[fs.Length]; 
  6.  
  7. fs.Read (data, 0, data.Length); 

下面的方法提供了一个比上面方法更安全的方法,来保证文件被完全读出

  1. public static void SafeRead (Stream stream, byte data) 
  2.  
  3.    int offset=0; 
  4.  
  5.    int remaining = data.Length; // 只要有剩余的字节就不停的读 
  6.  
  7.    while (remaining > 0) 
  8.    { 
  9.      int read = stream.Read(data, offset, remaining); 
  10.  
  11.      if (read <= 0) 
  12.  
  13.         throw new EndOfStreamException("文件读取到"+read.ToString()+"失败!"); // 减少剩余的字节数 
  14.  
  15.         remaining -= read; // 增加偏移量 
  16.  
  17.         offset += read; 
  18.  
  19.     } 
  20.  } 

有些情况下你不知道流实际的长度,比如:网络流。此时可以使用类似的方法读取流直到流里面的数据完全读取出来为止。我们可以先初始化一段缓存,再将流读出来的流信息写到内存流里面,就像下面这样:

  1. public static byte ReadFully (Stream stream) 
  2.    // 初始化一个32k的缓存 
  3.  
  4.    byte buffer = new byte[32768]; 
  5.  
  6.    using (MemoryStream ms = new MemoryStream()) 
  7.    { 
  8.  
  9.        //返回结果后会自动回收调用该对象的Dispose方法释放内存 // 不停的读取 
  10.  
  11.        while (true
  12.        { 
  13.  
  14.             int read = stream.Read (buffer, 0, buffer.Length); // 直到读取完最后的3M数据就可以返回结果了 
  15.  
  16.           if (read <= 0) 
  17.  
  18.              return ms.ToArray(); ms.Write (buffer, 0, read); 
  19.         } 
  20.     } 

虽然上面的例子都比较简单,效果也不是很明显(大部分都是对的),也许你早就会了,没关系这篇文章本来就是写给初学者的。 下面的方法提供了一种使用指定缓存长度的方式读取流,虽然在很多情况下你可以直接使用Stream.Length得到流的长度,但是不是所有的流都可以得到。

  1. public static byte Read2Buffer (Stream stream, int BufferLen) 
  2.     // 如果指定的无效长度的缓冲区,则指定一个默认的长度作为缓存大小 
  3.  
  4.     if (BufferLen < 1) 
  5.     { BufferLen = 0x8000; } // 初始化一个缓存区 
  6.  
  7.     byte buffer = new byte[BufferLen]; 
  8.  
  9.     int read=0; int block; // 每次从流中读取缓存大小的数据,知道读取完所有的流为止 
  10.  
  11.      while ( (block = stream.Read(buffer, read, buffer.Length-read)) > 0) 
  12.      {  
  13.  
  14.             // 重新设定读取位置 
  15.  
  16.            read += block; // 检查是否到达了缓存的边界,检查是否还有可以读取的信息 
  17.  
  18.            if (read == buffer.Length) 
  19.            { 
  20.  
  21.               // 尝试读取一个字节 
  22.  
  23.                 int nextByte = stream.ReadByte(); // 读取失败则说明读取完成可以返回结果 
  24.  
  25.                  if (nextByte==-1) 
  26.                  { 
  27.                      return buffer; 
  28.  
  29.                  } // 调整数组大小准备继续读取 
  30.  
  31.                  byte newBuf = new byte[buffer.Length*2]; Array.Copy(buffer, newBuf, buffer.Length); 
  32.  
  33.                  newBuf[read]=(byte)nextByte; buffer = newBuf; 
  34.  
  35.                  // buffer是一个引用(指针),这里意在重新设定buffer指针指向一个更大的内存 
  36.  
  37.                  read++; 
  38.             } 
  39.          } // 如果缓存太大则使用ret来收缩前面while读取的buffer,然后直接返回 
  40.  
  41.      byte ret = new byte[read]; Array.Copy(buffer, ret, read); 
  42.      return ret; 
  43.  
  44. using System; 
  45. using System.IO; 
  46. using System.Collections; 
  47.  
  48. namespace TextFileReader_csharp 
  49.      class Class1 
  50.      { 
  51.         static void Main(string args) 
  52.         { 
  53.  
  54.             StreamReader objReader = new StreamReader("c:\\test.txt"); 
  55.  
  56.             string sLine=""
  57.  
  58.              ArrayList arrText = new ArrayList(); 
  59.  
  60.              while (sLine != null
  61.              { 
  62.  
  63.                  sLine = objReader.ReadLine(); 
  64.  
  65.                 if (sLine != null
  66.  
  67.                  arrText.Add(sLine); 
  68.  
  69.              } 
  70.  
  71.              objReader.Close(); 
  72.  
  73.              foreach (string sOutput in arrText) 
  74.                 Console.WriteLine(sOutput); Console.ReadLine(); 
  75.  
  76.          } 
  77.       } 
  • 上一篇资讯: ASP.NET4.0一些隐性的扩展
  • 下一篇资讯: C#常用数据检查类
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师