文件流、递归//20131022~20131023

一、文件流:

C#将文件看成是顺序的字节流,也称为文件流。
(1)文件流是字节序列的抽象概念,文件可以看成是存储在磁盘上的一系列二进制字节信息
(2)C#用文件流对文件进行输入、输出操作
(3)C#提供Stream类(System.IO成员)是所有流的基类,由它派生出文件流FileStream和缓冲区流BufferedStream

 

二、文件夹操作:

      Directory类提供了文件夹操作的方法,Directory类内的方法是静态的,无须创建对象即可使用。


Directory类常用方法包括:
(1)CreateDirectory  创建文件夹
(2)Move  移动文件夹
(3)Delete  删除文件夹
(4)GetFiles  返回指定目录中的文件的名称
(5)GetFileSystemEntries  返回指定目录中所有文件和子目录的名称 (返回在当前目录中的文件和目录名的string对象数组)
(6)GetCreationTime   返回创建目录的日期和时间 
(7)GetCurrentDirectory  返回应用程序的当前工作目录
(8)GetDirectories  返回指定目录中所有子目录的名称(返回表示当前目录下的目录名的string对象数组)
(9)GetFiles  返回指定目录中所有文件的名称 (返回表示当前目录中的文件名的string对象数组)
(10)GetLogicalDrives  返回所有逻辑驱动器名称
(11)GetParent  返回指定目录的父目录
(12)SetCreationTime  设置创建目录的日期和时间
(13)SetCurrentDirectory  设置应用程序的当前工作目录 

 

三、文件操作

      File类提供了文件操作的方法,并协助创建FileStream对象,和Directory类一样,File类的方法是静态的,无须创建对象即可使用。


常用方法:

(1)Create  创建文件
注:使用File.Create创建再复制/移动/删除时会提示:文件正由另一进程使用,因此该进程无法访问该文件
    改用 FileStream 获取 File.Create 返回的 System.IO.FileStream 再进行关闭就无此问题
(2)Copy  复制文件
(3)Move  移动文件
(4)Delete  删除文件
(5)Exists  确定指定的文件是否存在
(6)AppendAllText  将指定的字符串追加到文件中,如果文件不存在则创建该文件
(7)Exists  判断指定文件是否存在
(8)GetAttributes  返回指定文件的文件属性对象
(9)GetCreationTime  返回创建指定文件的日期和时间
(10)GetLastAccessTime  返回访问指定文件的日期和时间
(11)GetLastWriteTime  返回写入指定文件的日期和时间
(12)Open  打开指定路径上的FileStream
(13)OpenRead  打开指定文件以进行读取
(14)OpenWrite  打开指定文件以进行写入
(15)ReadAllBytes  打开一个文件,将文件的内容读入一个字节数组,然后关闭该文件
(16)ReadAllLines  打开一个文件,将文件的内容读入一个字符串数组,然后关闭该文件
(17)ReadAllText  打开一个文件,将文件的内容读入一个字符串,然后关闭该文件
(18)Replace  使用其他文件的内容替换指定文件的内容,删除原始文件,并创建被替换文件的备份

注:操作一个资源 : 数据库,文件等 的流程一般都是 连接,操作,关闭

 

四、FileStream类
使用FileStream类可以产生文件流,以便对文件进行读取、写入、打开和关闭操作•
1、FileStream类提供的构造函数很多,最常用的构造函数如下
public FileStream(string path, FileMode mode)  它使用指定的路径和模式初始化FileStream类的对象。其中,path指定文件的相对路径或绝对

路径;mode指定一个FileMode常数,确定如何打开或创建文件.
(1)FileMode常数如下所示
Append:追加文件,如果文件不存在则创建
Create:创建文件,如果文件已存在,调用Truncate,否则调用CreateNew
CreateNew:创建新文件,要求文件不存在
Open:打开已有文件
OpenOrCreate:打开(已有)文件或创建新文件
Truncate:打开已有文件,且文件一打开就被截断为零字节
2、FileStream类的常用方法有
(1)Close  关闭流并释放相关资源
(2)Flush  清空缓冲区,使缓冲数据被写入设备
(3)Lock  允许读取访问的同时防止其他进程修改FileStream
(4)UnLock  允许其他进程访问以前锁定的某个FileStream
(5)Read  从流中读取字节块并写入指定缓冲区
(6)ReadByte  从流中读取一个字节
(7)Write  向流中写入从指定缓冲区读取的字节块(三个参数:要写入的数组,开始写入的数组下标和要写入的字节数)
(8)WriteByte  向流中写入一个字节
(9)Seek  设置该流的读写指针位置

 

五、文本文件的操作
    文本文件的操作通过StreamReader和StreamWriter两个类提供的方法来实现的
1、StreamReader类按照一种特定的编码从字节流中读取字符,其常用的构造函数如下
(1)StreamReader(Stream)  为指定的流初始化StreamReader类的新实例
(2)StreamReader(String)  为指定的文件名初始化StreamReader类的新实例
(3)StreamReader(Stream,Encoding)  用指定的字符编码为指定的流初始化StreamReader类的一个新实例
(4)StreamReader(String,Encoding)  用指定的字符编码,为指定的文件名初始化StreamReader类的一个新实例
2、StreamReader类的常用的方法如下所示
(1)Close  关闭流并释放相关资源
(2)Read  读取一个或若干个字符
(3)ReadLine  读取一行字符
(4)ReadToEnd  从流的当前位置读取到末尾
(5)Peek  返回下一个可用的字符,但不移动文件指针
3、使用Streamreader类读取数据的过程
   首先建立一个FileStream文件流,然后通过StreamReader类的方法将文件流中的数据读取出来
4、StreamWriter类以一种特定的编码输出字符,其常用的构造函数如下
(1)StreamWriter(Stream)  使用默认编码和缓冲区大小,为指定的流初始化StreamWriter类的一个对象
(2)StreamWriter(String)  使用默认编码和缓冲区大小,为指定文件初始化StreamWriter类的一个对象
(3)StreamWriter(Stream,Encoding)  用指定的编码及默认缓冲区大小,为指定的流初始化StreamWriter类的一个对象
(4)StreamWriter(string path,bool append)  path表示要写入的完整文件路径,append表示确定是否将数据追加到文件
   注:如果该文件存在,并且append为false,则该文件被改写;如果该文件存在,并且append为true,则数据被追加到该文件中,否则,将创建

新文件。
5、StreamWriter类的常用的方法如下
(1)Write  写入一个或若干个字符
(2)WriteLine  写入一行字符
(3)Close  关闭流并释放相关资源
6、使用StreamWriter类写入数据的过程
   首先建立一个FileStream文件流,然后通过StreamWriter的Write/WriteLine方法将数据写入到该文件流中

 

六、二进制文件操作
   二进制文件操作是通过BinaryReader和BinaryWriter两个类提供的方法来实现的,与文本文件的操作类似
1、BinaryReader类从文件流中读取二进制值,其常用的构造函数如下
(1)BinaryReader(Stream)  为指定的流初始化BinaryReader类的新实例
(2)BinaryReader(Stream,Encoding)  用指定的字符编码为指定的流初始化BinaryReader类的一个新实例
2、BinaryReader类的常用的方法如下所示
(1)Close  关闭流并释放相关资源
(2)PeekChar  返回下一个可用的字符,但不移动文件指针
(3)Read  读取一个或若干个字节
(4)ReadBoolean  读取Boolean值
(5)ReadByte  读取一个字节
(6)ReadBytes  读取若干个字节
(7)ReadChar  读取一个字符
(8)ReadChars  读取若干个字符
(9)ReadDecimal  读取Decimal数值
(10)ReadDouble  读取Double数值
(11)ReadSByte  读取sbyte数值
(12)ReadSingle  读取float数值
(13)ReadString  读取字符串数值
3、使用BinaryReader类读取数据的过程
   首先建立一个FileStream文件流,然后通过BinaryReader类的方法将文件流中的数据读取出来
4、BinaryWriter类向文件流写入二进制值,其常用的构造函数如下
(1)BinaryWriter(Stream)  使用默认编码和缓冲区大小,为指定的流初始化BinaryWriter类的一个对象
(2)BinaryWriter(Stream,Encoding)  用指定的编码及默认缓冲区大小,为指定的流初始化BinaryWriter类的一个对象
5、BinaryWriter类的常用的方法如下
(1)Write  写入任意的值类型和字符串类型数据
(2)Seek  设置文件指针位置
(3)Close  关闭流并释放相关资源
6、使用BinaryWriter类写入数据的过程
   首先建立一个FileStream文件流,然后通过BinaryWriter的Write方法将数据写入到该文件流中


七、递归:
   任何一个方法既可以调用其他方法也可以调用自己,而当这个方法调用自己时,我们就叫它递归函数或递归方法。
   特点:
(1)递归方法一直会调用自己直到某些条件被满足
(2)递归方法会有一些参数,而它会把一些新的参数值传递给自己。


------------------------------------------------------------------        

           string path = @"D:\CStudy";
            string fileName;
            Console.WriteLine("请输入文件名");
            fileName = Console.ReadLine();
            string a = path + "\\" + fileName+".txt";
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            if (!File.Exists(a))
            {
                File.Create(a).Close();    
            }

            FileInfo fInfo = new FileInfo(a);
            if (fInfo.IsReadOnly)
            {
                fInfo.IsReadOnly = false;
            }

            StreamWriter sw2 = File.AppendText(a);
            Console.WriteLine("随便写");
            string c = Console.ReadLine();
            sw2.WriteLine(c);
            sw2.Close();

--------------------------------------------------------------------
       public static void CopyDir(string srcPath, string aimPath)
        {
            try
            {
             
                // 判断目标目录是否存在如果不存在则新建
                if (!System.IO.Directory.Exists(aimPath))
                {
                    System.IO.Directory.CreateDirectory(aimPath);
                }
                // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
                // 如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法
                // string[] fileList = Directory.GetFiles(srcPath);
                string[] fileList = System.IO.Directory.GetFileSystemEntries(srcPath);
                // 遍历所有的文件和目录
                foreach (string file in fileList)
                {
                    // 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
                    if (System.IO.Directory.Exists(file))
                    {
                        CopyDir(file, aimPath);
                    }
                    // 否则直接Copy文件
                    else
                    {
                        System.IO.File.Copy(file, aimPath +"\\"+ System.IO.Path.GetFileName(file), true);
                    }
                }
            }
            catch (Exception e)
            {
                throw;
            }
        }

--------------------------------------------------------------------
//读filename到byte[]

private static byte[] ReadFile(string fileName)
        {
            FileStream pFileStream = null;
            byte[] pReadByte = new byte[0];
            try
            {
                pFileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                BinaryReader r = new BinaryReader(pFileStream);
                r.BaseStream.Seek(0, SeekOrigin.Begin);    //将文件指针设置到文件开
                pReadByte = r.ReadBytes((int)r.BaseStream.Length);
               return pReadByte;
            }
            catch
            {
                return pReadByte;
            }
            finally
            {
                if (pFileStream != null)
                  pFileStream.Close();

            }

        }

        //写byte[]到fileName

        private static  bool writeFile(byte[] pReadByte, string fileName)
        {
            FileStream pFileStream = null;
            try
            {
                pFileStream = new FileStream(fileName, FileMode.OpenOrCreate);
                pFileStream.Write(pReadByte, 0, pReadByte.Length);

            }
            catch
            {

                return false;

            }

            finally
            {
               if (pFileStream != null)
                    pFileStream.Close();

            }

            return true;

        }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值