file的操作和各种流的操作

.net中的文件和各种流的区分以及各种操作 对各种资源的读取



字节流的操作就是filestream

C#使用FileStream类从文本中读数据  

2010-05-17 19:42:52|  分类: c#学习入门|字号 订阅

FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。

一、创建FileStream对象

1、FileStream对象最简单的构造函数仅仅带有两个参数,即文件名和FileMode枚举值。

FileStream aFile = new FileStream(filename, FileMode);

2、另一个常用的构造函数如下: 

FileStream aFile = new FileStream(filename, FileMode, FileAccess);

三个参数的意义分别为:filename文件名,FileMode枚举类型,表示如何打开文件的模式。FileAccess也是枚举类型,用于改变对用户的访问权限。

FileMode枚举成员:

使用每个值会发生什么,取决于指定的文件名是否表示已有的文件。注意创建流时该流指向文件中的位置,除非特别说明,否则流就指向文件的开头。

Append
文件存在打开文件,当前位置指向文件的末尾,只能与枚举FileAccess.Write联合使用。文件不存在创建新文件。

Create
文件存在删除该文件,然后创建新文件。文件不存在创建新文件。 

CreateNew
文件存在抛出异常,文件不存在创建新文件。 

Open
文件存在打开现有的文件,流指向文件的开头。文件不存在抛出异常

OpenOrCreate
文件存在打开文件,流指向文件的开头。文件不存在创建新文件并打开

Truncate
打开现有文件,清除其内容。流指向文件的开头,保留文件的初始创建日期。文件不存在抛出异常。

FileAccess枚举成员:

Read
打开文件,用于只读

Write
打开文件,用于只写

ReadWrite
打开文件,用于读写

对文件进行不是FileAccess枚举成员指定的操作会导致抛出异常。此属性的作用是,基于用户的身份验证级别改变用户对文件的访问权限。

在FileStream构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess. ReadWrite。

3、创建FileStream对象,不必以FileStream构造函数的参数形式提供前面所有的信息。File和FileInfo类都提供了OpenRead()和OpenWrite()方法,更易于创建FileStream对象。前者打开了只读访问的文件,后者只允许写入文件。

我们回顾一下:
Open方法打开文件,返回文件流FileStream对象。
OpenRead方法打开现有文件来读取数据,返回只读流FileStream对象。
OpenWrite方法打开现在文件以进行写入,返回只写不共享的FileStream对象。

例如,下面的代码行打开了用于只读访问的Text.txt文件:

FileStream aFile = File.OpenRead("Test.txt");

注意下面的代码执行同样的功能:

FileInfo aFileInfo = new FileInfo("Test.txt");
FileStream aFile = aFile.OpenRead();

二、读取数据

使用FileStream类读取数据不像StreamReader类读取数据那样容易。这是因为FileStream类只能处理原始字节(raw byte)。处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream类将数据直接读入字符串,而使用StreamReader类却可以这样处理。但是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。

FileStream.Read()方法是从FileStream对象所指向的文件中访问数据的主要手段。这个方法从文件中读取数据,再把数据写入一个字节数组。它有三个参数:第一个参数是传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。它通常是0,表示从数组开端向文件中写入数据。最后一个参数指定从文件中读出多少字节。

下面我们看实例:

using System;
using System.Text;
using System.IO;
class Program
{
static void Main()
{
   Console.WriteLine("要输入要读取的路径,指定路径的完整名称");
   string path = Console.ReadLine();
   try
   {
    if (File.Exists(path))
    {
     FileStream fs = File.OpenRead(path);
     byte[]str = new byte[200];
     while (fs.Read(str, 0, str.Length) > 0)
     {
      Console.WriteLine(System.Text.Encoding.Default.GetString(str));
     }
     fs.Close();
    }
    else
     Console.WriteLine("该文件不存在");
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
   }
   Console.ReadLine();
}
}

从键盘接收文件路径,然后使用Exits方法判断文件是否存在,如果存在,则使用FileStream类的OpenRead方法打开并读取,将读到的数据存放在字节数组中,然后将字节按默认编码方式解码成字符串并输出到控制台。流不使用时,一定要及时关闭。fs.Close()关闭流


字符流的操作有:streamreader 和streamwriter

    FileStream对象通常会在StreamWriter或StreamReader内使用,并使用它们的方法处理文件。
        /// <summary>
        /// StreamWriter写入方法
        /// </summary>
        private void StreamWriterMetod()
        {
            try
            {
                FileStream fsFile = new FileStream(@"d:\log.txt",FileMode.OpenOrCreate);
                StreamWriter swWriter = new StreamWriter(fsFile);
                //写入数据
                swWriter.WriteLine("Hello Wrold.");
                swWriter.WriteLine("It is now {0}", DateTime.Now.ToLongDateString());   
                swWriter.Close();
            }
            catch (Exception e)
            {

                throw e;
            }
        }

        /// <summary>
        /// StreamWriter读取方法
        /// </summary>
        private void StreamReaderMetod()
        {
            string sLine = "";
            try
            {
                FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);
                StreamReader srReader = new StreamReader(fsFile);
                //读取文件(读取大文件时,最好不要用此方法)
                sLine = srReader.ReadToEnd();
                txbValue.Text = sLine;
                srReader.Close();
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        /// <summary>
        /// StreamWriter读取方法2
        /// </summary>
        private void StreamReaderMetodTwo()
        {
            try
            {
                FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);

               
                StreamReader srReader = new StreamReader(fsFile);
                int iChar;
                iChar = srReader.Read();
                while (iChar != -1)
                {
                    txbValue.Text += (Convert.ToChar(iChar));
                    iChar = srReader.Read();
                }
                srReader.Close();
            }
            catch (Exception e)
            {
                throw e;
            }
        }
注:FileMode枚举成员值在文件存在与不存在时的情况 

 
Append
 文件存在时:打开文件,流指向文件的末尾,只能与枚举FileAcess.Write联合使用
 文件不存在时:创建一个新文件。只能与枚举FileAcess.Write联合使用
 
Create
 文件存在时:删除该文件,然后创建新文件
 文件不存在时:创建新文件
 
CreateNew
 文件存在时:抛出异常
 文件不存在时:创建新文件
 
Open
 文件存在时:打开现有文件,流指向文件开头
 文件不存在时:抛出异常
 
OpenOrCreate
 文件存在时:打开文件,流指向文件开头
 文件不存在时:创建新文件
 
Truhncate
 文件存在时:打开现有文件,清除其内容。流指向文件开头,保留文件的初始创建日期。
 文件不存在时:抛出异常





StreamWrite,StreamReader确实是要通过编码方式读取字节流,适合操作字符串,但不是只能处理文本文件,各种字节流都可以通过StreamWrite,StreamReader进行字符串操作。
FileStream顾名思义就知道是用来操作文件流的。
其实说到底只是微软包装过的,用来操作字节流的组件,很多的功能都是重复的,只是有的比较适合,用起来比较方便。你也可以自己写一些xxstream的。


c#中的文件操作:http://www.cnblogs.com/qinfei/archive/2005/11/03/268229.html 里面的内容很全
 1、建立一个文本文件 
    public class FileClass 
    { 
     public static void Main() 
     { 
     WriteToFile(); 
     } 
     static void WriteToFile() 
     { 
     StreamWriter SW; 
     SW=File.CreateText("c:\MyTextFile.txt"); 
     SW.WriteLine("God is greatest of them all"); 
     SW.WriteLine("This is second line"); 
     SW.Close(); 
     Console.WriteLine("File Created SucacessFully"); 
     } 
    } 
    2、读文件 
    public class FileClass 
    { 
     public static void Main() 
     { 
     ReadFromFile("c:\MyTextFile.txt"); 
     } 
     static void ReadFromFile(string filename) 
     { 
     StreamReader SR; 
     string S; 
     SR=File.OpenText(filename); 
     S=SR.ReadLine(); 
     while(S!=null) 
     { 
     Console.WriteLine(S); 
     S=SR.ReadLine(); 
     } 
     SR.Close(); 
     } 
    } 
    3、追加操作 
    public class FileClass 
    { 
     public static void Main() 
     { 
     AppendToFile(); 
     } 
     static void AppendToFile() 
     { 
     StreamWriter SW; 
     SW=File.AppendText("C:\MyTextFile.txt"); 
     SW.WriteLine("This Line Is Appended"); 
     SW.Close(); 
     Console.WriteLine("Text Appended Successfully"); 
     } 
    }

你可能感兴趣的:(exception,String,File,Class,Path,byte)