• 操作文件方法简单总结(File,Directory,StreamReader,StreamWrite )(转载)


           本文转自http://www.cnblogs.com/zery/p/3315889.html

    对于文件夹,文档的操作一直处于一知半解状态,有时间闲下来了,好好练习了一把,对文档,文件的操作有了一个基本的认知,

    若要深入了解,还是得通过实际的项目才行了,好了废话不多说,上酸菜!!

     注:红色标题为园友@李大菜鸟与@flyher补充的方法再次感谢

    一 基本介绍

        操作文档,文件夹,需要用到的类

        1 Directory(静态类) :     用于创建、移动和删除等操作通过目录和子目录

           DirectoryInfo(非静态):

        2 File(静态类)  :提供用于创建、复制、删除、移动和打开文件的静态类,并协助创建 FileStream 对象    

           FileInfo(非静态)

        3 StreamReader实现一个 TextReader,使其以一种特定的编码从字节流中读取字符

         StreamWriter:实现一个 TextWriter,使其以一种特定的编码向流中写入字符

    二   文件夹操作

      操作文件夹用Directory 或者 DirectoryInfo

      2.1 创建文件夹

     1        string path = @"F:TestFile";
     2       //创建文件夹
     3         public void CreatFolder(string path)
     4         {
     5             if (Directory.Exists(path))
     6             {
     7                 Directory.Delete(path);
     8             }
     9            Directory.CreateDirectory(path);
    10             
    11         }
    展开代码

         2.2 删除文件夹

     1          string path = @"F:TestFile";
     2 
     3         //删除文件夹
     4         public void DeleteFolder(string path)
     5         {
     6             //先删除文件夹中所有文件
     7             DirectoryInfo directoryInfo = new DirectoryInfo(path);
     8             foreach (var directory in directoryInfo.GetFiles())
     9             {
    10                 File.Delete(directory.FullName);
    11             }
    12             //文件夹必须为空
    13             if (Directory.Exists(path))
    14             {
    15                 Directory.Delete(path);
    16             }
    17         }
    展开代码

         2.3 移动文件夹

                 string path = @"F:TestFile";
                string newPath = @"F:NewFile";
           //移动文件夹
            public void MoveFolder(string path, string newPath)
            {
                if (Directory.Exists(path))
                {
                    //移动包括文件夹在内的所有文件
                    Directory.Move(path,newPath);
                }
            }
    展开代码

         2.4 获取文件夹下所有文件名

           string path = @"F:TestFile";
    
            //获取文件夹下所有文件名
            public void GetFolderAllFiles(string path)
            {
                DirectoryInfo directory = new DirectoryInfo(path);
                var files = directory.GetFiles();
                foreach (var file in files)
                {
                    Console.WriteLine(file.Name);
                    Console.WriteLine(file.FullName);//带文件路径全名
                }
            }
    展开代码

         2.5  文件夹重命名 

      其实与移动文件夹方法是一样的,.net并没有提供重命名的方法,而是用新路径替换原路径以达到重命名的交果

            string name = @"F:TestFile";
            string newName = @"F:NewFile";
            //文件夹重命名
            public void Rename(string name ,string newName)
            {
                if (Directory.Exists(name))
                {
                    File.Move(name,newName);
                }
            }
    展开代码

         2.6 获取文件夹下所有文件夹名

            string path = @"F:TestFile";
            //获取路径下所有文件夹
            public void GetAllFolder(string path)
            {
                DirectoryInfo directory = new DirectoryInfo(path);
                DirectoryInfo[] allFolder = directory.GetDirectories();//返回当前目录的子目录(文件夹)
                foreach (var folder in allFolder)
                {
                    Console.WriteLine(folder.Name);
                    Console.WriteLine(folder.FullName);//带全路径的名称
                    //还可以再遍历子文件夹里的文件,或文件夹(最好用递归的方式)
                    folder.GetDirectories();
                }
            }    
    展开代码

         2.7 处理路径得到文件名和文件后缀

           string path = @"F:TestFile";
           //处理路径得到文件名和文件后缀,
            public void FormatFile(string path)
            {
                DirectoryInfo directory = new  DirectoryInfo(path);
                FileInfo[] files = directory.GetFiles();
                foreach (var file in files)
                {
                    string name = Path.GetFileNameWithoutExtension(file.Name);//取文件名
                    string extension = Path.GetExtension(file.Name);//取后缀名
                    Console.WriteLine("文件名:{0} 后缀名:{1}",name,extension);
                }
            }
    展开代码

         2.8 判断路径是文件或者文件夹(无效路径返回0)

            string path = @"F:TestFile";
            //判断路径是文件或者文件夹(无效路径返回0)
            public void IsFileOrFolder(string path)
            {
                DirectoryInfo directory = new DirectoryInfo(path);
                if (directory.Exists)//指定的目录是否存在
                    Console.WriteLine("Folder");
                else if (File.Exists(path))//指定的文件是否存在
                    Console.WriteLine("File");
                else
                    Console.WriteLine("0");
            }
    展开代码

     三 文档操作(txt)

      需要以下几个类:Directory 或者DirectoryInfo ,File 或者 FileInfo

       3.1 创建文档

            string path = @"F:TestFile	est.txt";
            //创建文档
            public void CreateFile(string path)
            {
                //文件路径用Directory判断是否存在
                if (Directory.Exists(path))
                {
                    //先删除存在的文件 
                    if (File.Exists(path))
                    {
                        File.Delete(path);
                    }
                    File.Create(path);
                }
            }
    展开代码

       3.2 复制文档

          string path = @"E:TestFile	est.txt";
          string newPath = @"E:Test2File
    ewTest.txt";
          //复制文档
            public void CopyFile(string sourcePath, string destPath)
            {
                //只能针对同一卷轴(盘)下的文件
                //destPath 为要复制的新地址,(destPath指定的文件名必须是未创建的,执行Copy方法时才会创建该文件)
                if (File.Exists(sourcePath))
                {
                    File.Copy(sourcePath, destPath);
                }
            }
    View Code

       3.3  移动文档

           string path = @"E:TestFile	est.txt";
           string newPath = @"E:Test2File
    ewTest.txt";
           //移动文档
            public void MoveFile(string SourcePath, string destPath)
            {
                //只能针对同一卷轴(盘)下的文件
                //destPath 为要移动的新地址(destPath指定的文件名必须是未创建的,执行Move方法时会将Source文件移动到新地址可以重新命名)
                if (File.Exists(SourcePath))
                {
                    File.Move(SourcePath, destPath);
                }
            }
    展开代码

       3.4  删除文档

            string path = @"E:TestFile	est.txt";
           //删除文档
            public void DeleteFile(string path)
            {
                if (File.Exists(path))
                {
                    File.Delete(path);
                }
            }
    展开代码

     四 文档读写操作(文档流操作) 对 第三点  的扩充

         需要以下类:FileStream 此类继承了Stream 类并重写了大部分方法,并提供多个带参构造函数,注意:要读取的目标流不是保持恒定的,而是每读一次就会相应的减少,在练习时

    没注意,纠结了很久

       4.1 写入字符

            string path = @"E:TestFile	est.txt";
            //往以有文档中写入字符
            public void CreateText(string path)
            {
                StreamWriter writer=File.CreateText(path);
                //直接写入字符的write方法,每次写入都会覆盖之前的内容
                writer.Write("你好!");
                //把缓存流的数据写入到基础流
                writer.Flush();
                //关闭StreamWriter对象及基础流
                writer.Close();
            }
    展开代码

       4.2 以流的形式写入文档

    //将一个文件内的数据,以流的方式读取,然后以流的形式写入到另一个文件中
            public void ReadAndWriteFile()
            {
                string readPath = @"E:TestFileReadStream.txt";
                string writePath = @"E:TestFileWriteStream.txt";
    
                //Read
                //打开现有文件以进行读取
                FileStream rs = File.OpenRead(readPath);
                byte[] buffer = new byte[rs.Length];
                rs.Read(buffer, 0, buffer.Length);  //将文件内容读到字节流中
                rs.Close();
                //Write
                //打开现有文件以进行写入
                FileStream stream = File.OpenWrite(writePath);
                stream.Write(buffer, 0, buffer.Length);
                stream.Flush();
                stream.Close();
    
            }
    展开代码

       4.3 以流的形式追加到文档

            //将一个文件内的数据,以流的方式读取,然后以流的形式写入到另一个文件中(追加内容)
            public void ReadAndWriteNewFile()
            {
                string readPath = @"E:TestFileReadStream.txt";
                string writePath = @"E:TestFileWriteStream.txt";
                //Read
                FileStream rd = File.Open(readPath,FileMode.Open);
                byte[] buffer = new byte[rd.Length];
                rd.Read(buffer, 0, buffer.Length);
                rd.Close();
    
                //Write
                FileStream wt = File.Open(writePath,FileMode.Append);//设为追加到原文件中
                wt.Write(buffer,0,buffer.Length);
                wt.Flush();
                wt.Close();
            }
    展开代码

       4.4 读取目标文档指定的一行数据

            string paths = @"F:TestFileReadStream.txt";
            int readNum = 3;
            //读取目标文本指定的某一行数据
            public void ReadoneLine(string path,int readNum)
            {
                //可以循环读每一行,然后到Add到集合中,再到集合中做处理
                StreamReader reader = new StreamReader(path,Encoding.Default);
                var streamList = new List<string>();
                int count=0;
                string lineText = string.Empty;
    
                while ((lineText = reader.ReadLine()) != null)//对于流的读取每ReadLine一次流中就少一行,所直接在While用读到的流做判断,避免二次读
                {
                    streamList.Add(lineText);
                }
    
                foreach (var item in streamList)
                {
                    if (count == readNum - 1)
                    {
                        Console.WriteLine(item);
                    }
                    count++;
                }
                
            }
    展开代码

     4.5 循环读取文件

      static void Main(string[] args)
            {
                string readPath = @"c:TestFilea.rar";
                string writePath = @"c:TestFile.rar";
    
                //Read
                //打开现有文件以进行读取
                FileStream rs = File.OpenRead(readPath);
                FileStream stream = File.OpenWrite(writePath);
                byte[] buffer = new byte[2048];
                int nRead = 0;
                decimal dTotal = 0;
                while ((nRead = rs.Read(buffer, 0, buffer.Length))>0)
                {
                    dTotal += (decimal)nRead / (decimal)rs.Length;
              
                    Console.WriteLine(dTotal);
                    stream.Write(buffer, 0, buffer.Length);
                }
                
                rs.Close();
                //Write
                //打开现有文件以进行写入
                
                
                stream.Flush();
                stream.Close();
            }
    View Code

    五 读写流操作文档

     需要以下几个类:StreamReader StreamWriter

      5.1 字符串读取写操作

            //读取文档并写入到另一文档中(用字符串写入的方法)
            public void ReadFile() 
            {
                string readPath = @"E:TestFileReadStream.txt";
                string writePath = @"E:TestFileWriteStream.txt";
               
               using (StreamReader reader = new StreamReader(readPath,Encoding.Default)) //用默认的编码格式(必须要转格式否则乱码)
               {
    
                   var rd = reader.ReadToEnd();
                   
                   StreamWriter writer = new StreamWriter(writePath,true,Encoding.UTF8);//需要转成UTF-8的格式(可转可不转格式)
                   writer.Write(rd);
                   writer.Flush();
                   writer.Close();
    
               }
            }
    展开代码

      5.2 字符流读写操作

            //用字符流的方式读写文档
            public void ReadWriteByByte()
            {
    
                string readPath = @"F:TestFileReadStream.txt";
                string writePath = @"F:TestFileWriteStream.txt";
                using (StreamReader reader = new StreamReader(readPath,Encoding.Default))//需要指定编码,否则读到的为乱码
                {
                    #region 错误方法
                    //Read  注意:文本中的字符只能被读取一次,第二次时读取不到了
                    //var readStr =reader.ReadToEnd();//第一次读取
                    //char[] buffer = new char[readStr.Length];
                    //reader.Read(buffer, 0, buffer.Length);//第二次读取时,读不到值
                    #endregion
                    //Read 
                    char[] buffer = new char[10000];
                    reader.Read(buffer, 0, buffer.Length);
                    //Write
                    StreamWriter writer = new StreamWriter(writePath,true,Encoding.UTF8);
                    writer.Write(buffer, 0, buffer.Length);
                    writer.Flush();
                    writer.Close();
                }
    展开代码

    六 总结

         

           本文只对以上几个类常用的方法简单的介绍了,也是扫了下自己的盲区,如有更好的建议或方法,请指出。

    另外如果觉得本文对你有一点小小的帮助不妨点下推荐您的推荐是我写作的动力!!

  • 相关阅读:
    SQL Server, Timeout expired.all pooled connections were in use and max pool size was reached
    javascript 事件调用顺序
    Best Practices for Speeding Up Your Web Site
    C语言程序设计 使用VC6绿色版
    破解SQL Prompt 3.9的几步操作
    Master page Path (MasterPage 路径)
    几个小型数据库的比较
    CSS+DIV 完美实现垂直居中的方法
    由Response.Redirect引发的"Thread was being aborted. "异常的处理方法
    Adsutil.vbs 在脚本攻击中的妙用
  • 原文地址:https://www.cnblogs.com/ice-river/p/3413180.html
Copyright © 2020-2023  润新知