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

简介:

在通常的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;
        }
复制代码



本文转自齐师傅博客园博客,原文链接:http://www.cnblogs.com/youring2/archive/2012/04/12/2443660.html,如需转载请自行联系原作者
相关文章
|
2月前
|
C#
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
|
4月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
372 0
|
4月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
80 1
|
4月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
199 0
|
6月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
153 0
|
6月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
6月前
|
C#
C# 写日志文件
C# 写日志文件
63 0
|
6月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
530 2
|
6月前
|
存储 搜索推荐 C#
WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中
WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中
64 0
|
6月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
140 19