【转】C#读取文件信息的三个步骤

原文链接:http://developer.51cto.com/art/200908/145675.htm

 

在通常的C#开发中,你是怎么通过C#读取文件信息的?C#给我们提供了非常强大的类库(又一次吹捧了.NET一番),里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件的一般手段,使用流读取。是的没错,那么你真的会用它读取文件中的数据了么?真的能读完全么?

通常我们使用C#读取文件信息使用如下的步骤:

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

FileStream fs = File.OpenRead(filename);

或者

FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

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

byte[] data = new byte[fs.Length];

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

fs.Read (data, 0, data.Length);

我们只写了3句就可以用C#读取文件信息,而且里面的内容原封不动的读出来,真是太简洁了!可以这段代码真的能像你预期的那样工作么?答案是:几乎可以!

在大部分情况下上面的代码工作的很好,但是我们应该注意Read方法是有返回值的,既然有返回值那么一定有其道理,如果按照上面的写法完全可以是一个没有返回值的函数。我想返回值的目的是,为了给我们一个机会判断实际读取文件的大小,从而来判断文件是否已经完全读完。所以上面的代码不能保证我们一定读完了文件里面的所有字节(虽然在很多情况下是读完了)。下面的方法提供了一个比上面方法更安全的方法,来保证文件被完全读出。

        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);
                }
            }
        } 

 

虽然上面实现C#读取文件信息的例子都比较简单,效果也不是很明显(大部分都是对的),也许你早就会了,没关系这篇文章本来就是写给初学者的。

再来看一段代码示例:

        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;
        }

 

上面的方法提供了一种使用指定缓存长度的方式读取流,虽然在很多情况下你可以直接使用Stream.Length得到流的长度,但是不是所有的流都可以得到。通过这样的方法,我们可以轻松实现C#读取文件信息的简洁和完整性。

如果认为此文对您有帮助,别忘了支持一下哦!

作者:齐飞

来源:http://youring2.cnblogs.com/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

转载:http://www.cnblogs.com/youring2/archive/2012/04/12/2443660.html

时间: 2024-11-12 22:25:15

【转】C#读取文件信息的三个步骤的相关文章

php读取文件内容的三种方法

 这篇文章主要介绍了php读取文件内容的三种方法,需要的朋友可以参考下 php读取文件内容的三种方法:    //**************第一种读取方式*****************************  代码如下: header("content-type:text/html;charset=utf-8");  //文件路径  $file_path="text.txt";  //判断是否有这个文件  if(file_exists($file_path)

php读取文件内容的三种可行方法示例介绍_php技巧

php读取文件内容的三种方法: //**************第一种读取方式***************************** 复制代码 代码如下: header("content-type:text/html;charset=utf-8"); //文件路径 $file_path="text.txt"; //判断是否有这个文件 if(file_exists($file_path)){ if($fp=fopen($file_path,"a+&quo

PHP直接读取数据库信息的三种方法

这段代码的功能是: 连接到一个 url 地址为localhost . 端口为 3306 的mysql服务器上. 这段代码的功能是: 连接到一个 url 地址为localhost . 端口为 3306 的mysql服务器上.mysql服务器的帐号是"root",密码是"9999".mysql 服务器上有一个数据库 ok , 数据库里有一个表 abc.表 abc 一共为两列,列名分别是 "id" 和 "name" ,将 abc 里

直接读取数据库信息的三种方法

这段代码的功能是: 连接到一个 url 地址为localhost .端口为 3306 的mysql服务器上.mysql服务器的帐号是"root",密码是"9999".mysql 服务器上有一个数据库 ok , 数据库里有一个表 abc.表 abc 一共为两列,列名分别是 "id" 和 "name" ,将 abc 里的所有数据读出来. 以下为引用的内容: <? $dbh = @mysql_connect("loc

java读取文件内容的三种方法代码片断分享(java文件操作)_java

复制代码 代码如下: try {           // 方法一           BufferedReader br = new BufferedReader(new FileReader(new File(                   "D:\\1.xls")));           // StringBuilder bd = new StringBuilder();           StringBuffer bd = new StringBuffer();   

Java编程那些事儿87——文件操作之读取文件

11.3.1.3 读取文件 虽然前面介绍了流的概念,但是这个概念对于初学者来说,还是比较抽象的,下面以实际的读取文件为例子,介绍流的概念,以及输入流的基本使用. 按照前面介绍的知识,将文件中的数据读入程序,是将程序外部的数据传入程序中,应该使用输入流--InputStream或Reader.而由于读取的是特定的数据源--文件,则可以使用输入对应的子类FileInputStream或FileReader实现. 在实际书写代码时,需要首先熟悉读取文件在程序中实现的过程.在Java语言的IO编程中,读

Linux操作系统中读取目录文件信息的过程分析

  大致流程: 1.添加头文件 dirent.h 声明结构体指针 struct dirent * ptr; 声明一个dir指针 DIR * fd; 2.分析命令行 3.打开目录文件 使用opendir()参数为解析命令行的第二个参数 argv[1] ,返回目录文件指针值赋给 fd 4.输出重定向 使用freopen()参数为解析命令行第三个参数 argv[2].权限"w+".文件描述符stdtout 5.开始读取目录文件内容 使用循环 while((ptr=readdir(fd))!=

在vs2010中如何利用opencv使用“打开文件”选择路径读取视频信息

问题描述 在vs2010中如何利用opencv使用"打开文件"选择路径读取视频信息 代码如下,在网上找了好多都是使用绝对路径才能读取视频信息,我想用"打开文件"取得的文件路径,利用cvCaptureFromAVI读取视频应该怎么处理?或者可以用opencv提供的其他函数来读取视频的相关信息吗? 以下代码的错误提示:"cvCreateFileCapture": 不能将参数 1 从"CString"转换为"const c

java-Java 文件信息无法被读取??大牛们帮小白看看原因,谢谢!

问题描述 Java 文件信息无法被读取??大牛们帮小白看看原因,谢谢! 就是读取不了文件内容,都 是显示false 解决方案 你这个文件不存在 解决方案二: 你电脑上根本就没有helloWorld.txt文件,你想通过File这个类来创建,那你为什么不mkdirs()去创建该文件呢? 解决方案三: 创建时文件路径写错了吧 改这个试试 new file("D:iiohelloworldhelloworld.txt"); 解决方案四: 文件不是不被锁定了?是不是有别的编辑器打开呢?