C#文件的基本操作

前言

         在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类。文件夹(Folder)是只在Windows操作系统中使用的名词。在操作系统的理论中,人们更习惯于使用目录(Directory)这个名词。或许微软为了有朝一日将.Net移植到其他的操作系统中(实际上也有很多人也在做着这个项目),所以还是以Directory来命名操作文件夹的类。 

说明

命名空间:using System .IO;

1. File类(static):

      创建文件:File.Create(路径);创建文件,返回FileStream

FileStream fs = File.Create(路径);之后需要关闭否则打不开,fs.close();

      删除文件:File.Delete(路径);无返回值

      复制文件:File.Copy(源文件,目标文件);

      剪切文件:File.Move(源文件路径,目标路径);

      判断文件是否存在:File.Exists(路径);返回布尔型,true代表已存在

      文件加密:File.Encrypt();

      解密:File.Decrypt();

      获取创建时间:File.GetCreationTime(路径);返回DateTime类型

      修改创建时间:SetCreationTime(路径,DateTime类型);

      最后访问时间:File.GetLastAccessTime(路径);返回DateTime类型 

      修改访问时间:SetLastAccessTime(路径,DateTime类型);

      最后修改时间:File.GetLastWriteTime(路径);返回DateTime类型 

      修改最后修改时间:SetLastWriteTime(路径,DateTime类型);

2. Directory 类(static):目录(文件夹)

      创建目录:Directory .CreateDirectory(路径);

      删除目录:Directory .Delete(路径);

      目录是否存在:Directory .Exists(路径);

      获取子目录:Directory .GetDirectories(路径); 返回string数组

      获取子文件名:Directory .GetFiles(路径); 返回string数组,string[] s = Directory .GetFiles(路径);

      获取根目录:Directory .GetDirectoryRoot(路径);

      获取上一级目录:Directory .GetParent(路径); 

以下是实例方法,需要造对象new出来才能用,上面的都是静态方法

3.FileInfo 类

      创建文件:FileInfo f = new FileInfo(路径); FileStream s = f.Create(); s.Close();

      删除文件:FileInfo f = new FileInfo(路径); f.Delete();如果文件不存在会报错

      复制文件:FileInfo f = new FileInfo(路径); f.CopyTo(目标路径,是否覆盖(true是覆盖));

      移动文件:FileInfo f = new FileInfo(路径); f.MoveTo(目标路径);

      文件是否存在:FileInfo f = new FileInfo(路径); bool b = f.Exists;布尔型,是个属性

      获取文件名:FileInfo f = new FileInfo(路径);string s = f.FullName;属性,带路径的文件名

      获得创建时间:DateTime d = f.CreationTime;

      获取文件大小:f.Length

4.DirectoryInfo 类

      创建目录:DirectoryInfo d = new DirectoryInfo(路径); d.Create();

      删除目录:d.Delete();

      移动目录:d.MoveTo(目标路径);

      目录是否存在:bool b = d.Exists;

      获得目录全名:d.FullName;

      获得子文件对象信息数组: FileInfo[] f = d.GetFiles(); 返回的是文件对象数组,内容更详细,d.GetFiles("*.exe")只获取exe的文件

      获得子目录数组:DirectoryInfo[] dr = d.GetDirectories();

5.FileMode枚举(打开或者创建文件的形式)

      FileMode.CreateNew (创建新文件,如果文件已存在将会报错)

      FileMode.Create  (创建新文件。 如果文件已存在,它将被覆盖)

      FileMode.Open  (打开现有文件,如果文件不存在,报错)

      FileMode.OpenOrCreate (打开文件(如果文件存在);否则,应创建新文件)

      FileMode.Truncate (打开现有文件。 该文件被打开时,将被截断为零字节大小)

      FileMode.Append (在已有的文本中追加,如果不存在,将会创建)

使用File/Directory(静态类)还是FileInfo/DirectoryInfo?

       File类和Directory类都是静态类。使用它们的好处是不需要初始化对象。如果你对某一个文件或文件夹只进行一次操作,那你最好使用该静态类的静态方法,比如File.Move,File.Delete等等。如果你需要对一个文件或文件夹进行多次操作,那最好还是使用FileInfo和DirectoryInfo类。因为File类和Directory是静态类,所以你每次对一个文件或文件夹进行操作之前,它们都需要对该文件或文件夹进行一些检查,比如authentication。如果使用FileInfo类和DirectoryInfo类,只在初始化类的对象时进行相关的检查工作,也就是说只需要做一次,所以如果你需要对某个文件或文件夹进行多次操作,那最好使用FileInfo类和DirectoryInfo类。

示例

【1】生成TXT文本

          static void Xieru()
          {
            //创建图书集合
            List<Book> booklist = new List<Book>();
            booklist.Add(new Book() { Name = "鹿鼎记", Chubansheming = "人民文学出版社", Jiage = "120" });
            booklist.Add(new Book() { Name = "绝代双骄", Chubansheming = "中国长安出版社", Jiage = "50" });

            ///////写入文本

            //系统桌面路径
            string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            //创建文件流 构造函数(保存或者打开文件的路径,指示如何打开或者创建文件)
            FileStream filestream = new FileStream(path + "\\book.txt", FileMode.Create);

            //创建写入器 构造函数(要写入的流,要使用的字符编码。)
            StreamWriter sw = new StreamWriter(filestream, Encoding.GetEncoding("UTF-8"));

            //写入图书总数
            sw.WriteLine(booklist.Count);

            //遍历图书集合,写入图书对象
            foreach (var i in booklist)
            {
                sw.WriteLine(i.Name);
                sw.WriteLine(i.Chubansheming);
                sw.WriteLine(i.Jiage);
            }

            //关闭写入器
            sw.Close();
            //关闭文件流
            filestream.Close();

            Console.WriteLine("文件写入成功!");

            
        }

【2】读取TXT文本

        static void Read()
        {
            //创建文件流
            FileStream filestream = new FileStream(path,FileMode.Open);
            //创建读取器
            StreamReader streamreader = new StreamReader(filestream,Encoding.GetEncoding("UTF-8"));
            //输出展示
            int j =  Convert.ToInt32(streamreader.ReadLine());//第一行是几本书 确定循环次数
            for (int i = 0; i < j; i++ ) 
            {
                Console.WriteLine("第{0}本书:",i+1);
                Console.WriteLine("书名:" + streamreader.ReadLine());
                Console.WriteLine("出版社:" + streamreader.ReadLine());
                Console.WriteLine("价格:" + streamreader.ReadLine() + "\n");
                
            }
        }

资源管理器示例

把磁盘目录加载至TreeView中,对其子文件的删除或者复制操作

      public partial class FrmMain : Form
      {
        public FrmMain()
        {
            InitializeComponent();
            Initial();
        }

        public void Initial() //初始化
        {
            //初始化ListView
            this.listView1.View = View.Details;
            this.listView1.Columns.Add("文件名", 150, HorizontalAlignment.Center);
            this.listView1.Columns.Add("大小(KB)", 100, HorizontalAlignment.Left);
            this.listView1.Columns.Add("文件类型", 70, HorizontalAlignment.Center);
            this.listView1.Columns.Add("文件路径", 270, HorizontalAlignment.Center);
            //初始化D盘节点
            this.treeView1.Nodes.Add("E:\\");
            this.treeView1.Nodes[0].Tag = "E:\\";
            //初始化ListView
            this.listView1.FullRowSelect = true; //整行选中
            this.listView1.GridLines = true; //显示网格线
            this.listView1.ContextMenuStrip = this.contextMenuStrip1;
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) //节点选择事件
        {
            //清除选中节点的子节点
            this.treeView1.SelectedNode.Nodes.Clear();

            //创建目录 构造函数(路径)
            DirectoryInfo dicectoryInfo = new DirectoryInfo(this.treeView1.SelectedNode.Tag.ToString());

            try
            {
                //根据GetDirectories()方法返回当前目录的目录,返回值是一个目录数组
                DirectoryInfo[] dirs = dicectoryInfo.GetDirectories();
            
                //遍历目录数组,循环创造子节点添加至其选中的节点中
                foreach (DirectoryInfo di in dirs)
                {
                    TreeNode node = new TreeNode();
                    node.Text = di.Name; //目录名称
                    node.Tag = di.FullName; //目录路径
                    this.treeView1.SelectedNode.Nodes.Add(node);//添加至选中的节点中
                }

                //根据GetFiles()方法返回当前目录下的文件列表
                FileInfo[] fileinfo = dicectoryInfo.GetFiles();

                //清除ListView项
                this.listView1.Items.Clear();

                //遍历文件数组,加载至ListView中
                foreach(FileInfo myFile in fileinfo)
                {
                    //创建ListView项
                    ListViewItem item = new ListViewItem();
                    item.Text = myFile.Name; //文件名
                    item.SubItems.Add((myFile.Length/1024).ToString()); //文件大小
                    item.SubItems.Add(myFile.Extension.Substring(1));   //文件类型
                    item.SubItems.Add(myFile.FullName); //文件路径
                    //添加至ListView中
                  this.listView1.Items.Add(item);
                }    
            }
            catch (Exception ex) 
            {
                MessageBox.Show(ex.Message.ToString());
            }

        }

        private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(this.listView1.SelectedItems.Count !=1 )return;
            try
            {

                //创建打开文件窗口对象
                FolderBrowserDialog fdb = new FolderBrowserDialog();

                //获取返回结果
                DialogResult result = fdb.ShowDialog();

                //确保用户选择了确定
                if (result != DialogResult.OK) return;

                //源路径
                string sourcePath = this.listView1.SelectedItems[0].SubItems[3].Text;
                //新路径(用户选择的路径+文件名)
                string desPath = fdb.SelectedPath + this.listView1.SelectedItems[0].Text;

                //使用File类的静态方法(源路径,新路径,是否覆盖)
                File.Copy(sourcePath, desPath);

                MessageBox.Show("复制成功!");
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
        }

        private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.listView1.SelectedItems.Count != 1) return;
            if (DialogResult.OK != MessageBox.Show("确认删除吗?")) return;

            try
            {
                //在磁盘中删除选中项
                new FileInfo(this.listView1.SelectedItems[0].SubItems[3].Text).Delete();
               //在ListView中删除选中项
                this.listView1.SelectedItems[0].Remove();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
           
        }
    }

2018-9-4

猜你喜欢

转载自blog.csdn.net/qq_42766492/article/details/82357221