第19章 文件及I/O

来源:互联网 发布:手机淘宝通知提醒在哪 编辑:程序博客网 时间:2024/06/14 23:15

c#中与文件、文件夹及文件读写有关的类位于System.IO命名空间下

一、  文件操作基础

1  File类和FileInfo类介绍

    File类中的方法是静态方法

    (1)File实例

   

    if (textBox1.Text == string.Empty)
    {
        MessageBox.Show("文件名不能为空!");
    }
    else
    {
           if (File.Exists(textBox1.Text)) //File.Exists判断文件是否存在
           {
                MessageBox.Show("该文件已经存在!");
           }
           else
           {
                File.Create(textBox1.Text);  //File.Create创建文件
           }
    }


            //通过File.Create()得 到FileStream对象            using(FileStream fs=File.Create(@"c:\test.dat"))            {}            //通过File.Open()得到 FileStream对象            using(FileStream f2=File.Open(@"c:\test.dat",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None))            {}            //得到一个只读权限的的 FileStream对象            using(FileStream readOnlyStream=File.OpenRead(@"c:\test.dat"))            {}            //得到一个只写权限的的 FileStream对象            using(FileStream writeOnlyStream=File.OpenWrite(@"c:\test.dat"))            {}            //得到 StreamReader对象            using(StreamReader sreader=File.OpenText(@"c:\test.dat"))            {}            //得到 StreamWriter对象            using(StreamWriter sreader=File.CreateText(@"c:\test.dat"))            {}            using(StreamWriter sreader=File.AppendText(@"c:\test.dat"))            {}

            File 类型的其他方法简化读写文本数据的过程。

            string[] myTasks={"AAA","BBB","CCC"};            //向c盘文件写入数据            File.WriteAllLines(@"c:\task.txt",myTasks);            //重新读取数据,然后输出            foreach(string task in File.ReadAllLines(@"c:\task.txt"))            {                Console.WriteLine("TODO:{0}",task);            }            Console.ReadLine();

File.WriteAllLines 写入字符串数组,如果文件不存在,则创建文件




    (2)FileInfo实例

     if (textBox1.Text == string.Empty)
    {
        MessageBox.Show("文件名不能为空!");
    }
    else
    {
        FileInfo finfo = new FileInfo(textBox1.Text);
        if (finfo.Exists) //File.Exists判断文件是否存在
        {
            MessageBox.Show("该文件已经存在!");
        }
        else
        {
            FileStream fs=finfo.Create();  //File.Create创建文件

           fs.Close();

         }
    }

 

FileInfo.Create() 方法:创建文件

            FileInfo f = new FileInfo(@"c:\test.dat");            //创建文件,返回FileStream对象,FileStream能对基层文件进行同步/异步 读/写操作            FileStream fs= f.Create();            //关闭句柄来释放流的底层非托管资源            fs.Close();

            FileInfo f = new FileInfo(@"c:\test.dat");            using (FileStream fs = f.Create())            {                         }

FileInfo.Open() 方法:打开现有文件、同时使用它也能创建文件

            FileInfo f2 = new FileInfo(@"c:\Test2.dat");            using(FileStream fs2=f2.Open(FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None))            {                        }

FileInfo.OpenRead() 得到只读FileStream对象

FileInfo.OpenWrite() 得到只写FileStream对象

            FileInfo f3 = new FileInfo(@"c:\Test3.dat");            //得到只读FileStream对象            using(FileStream readOnlyStream=f3.OpenRead())            {                        }            FileInfo f4 = new FileInfo(@"c;\Test4.dat");            //得到只写FileStream对象            using(FileStream writeOnlyStream=f4.OpenWrite())            {                        }


FileInfo.OpenText()  返回StreamReader对象

            FileInfo f5 = new FileInfo(@"c:\boot.ini");            //得到StreamReader 读文件流            using(StreamReader sreader=f5.OpenText())            {                        }


FileInfo.CreateText() 得到StreamWriter对象

FileInfo.AppendText() 得到StreamWriter对象

            FileInfo f6 = new FileInfo(@"c:\test6.txt");            using(StreamWriter swriter=f6.CreateText())            {//FileInfo.CreateText() 得到StreamWriter对象}            using (StreamWriter swriter2 = f6.AppendText())            {//FileInfo.AppendText() 得到StreamWriter对象}



2  Directory类和DirectoryInfo类介绍

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == string.Empty)
            {
                MessageBox.Show("文件夹名称不能为空!");
            }
            else
            {
                DirectoryInfo dinfo = new DirectoryInfo(textBox1.Text);
                if (dinfo.Exists)
                {
                    MessageBox.Show("该文件夹已经存在!");
                }
                else
                {
                    dinfo.Create(); 
                }
            }
        }

 

DirectoryInfo 获得目录信息

            DirectoryInfo dir = new DirectoryInfo(@"c:\testing");            Console.WriteLine("*******目录信息********");            Console.WriteLine("全名称:{0}",dir.FullName);            Console.WriteLine("名称:{0}", dir.Name);            Console.WriteLine("父目录:{0}", dir.Parent);            Console.WriteLine("创建时间:{0}", dir.CreationTime);            Console.WriteLine("目录特性:{0}",dir.Attributes);            Console.WriteLine("路径根:{0}",dir.Root);            Console.WriteLine("*******************\n");

DirectoryInfo 获取文件夹下的xml文件

            string path = Environment.CurrentDirectory;            DirectoryInfo dir = new DirectoryInfo(string.Format(@"{0}\ProductsXML", path));            FileInfo[] xmlFile = dir.GetFiles("*.xml",SearchOption.AllDirectories);            Console.WriteLine("发现{0} *.xml 文件\n",xmlFile.Length);            foreach(FileInfo f in xmlFile)            {                Console.WriteLine("*******************");                Console.WriteLine("文件名称:{0}",f.Name);                Console.WriteLine("文件大小:{0}",f.Length);                Console.WriteLine("创建时间:{0}",f.CreationTime);                Console.WriteLine("文件特性:{0}",f.Attributes);                Console.WriteLine("*******************\n");            }

DirectoryInfo 创建子目录

            DirectoryInfo dir = new DirectoryInfo(@"c:\");            dir.CreateSubdirectory("MyFolder");            DirectoryInfo myDataFolder= dir.CreateSubdirectory(@"MyFolder2\Data");            Console.WriteLine("新目录是:{0}",myDataFolder);

Directory 电脑驱动器 、删除目录

            //电脑所有驱动器            string[] drives = Directory.GetLogicalDrives();            Console.WriteLine("电脑驱动器:");            foreach (string s in drives)                Console.WriteLine("--> {0}",s);            Console.WriteLine("删除目录");            Console.ReadLine();            try            {                Directory.Delete(@"c:\MyFolder");                Directory.Delete(@"c:\MyFolder2",true);            }            catch(IOException e)            {                Console.WriteLine(e.Message);            }


DriveInfo 获取电脑驱动器

            Console.WriteLine("*******盘符信息********");            DriveInfo[] myDrives = DriveInfo.GetDrives();            foreach(DriveInfo d in myDrives)            {                Console.WriteLine("名称:{0}",d.Name);                Console.WriteLine("类型:{0}",d.DriveType);                //驱动器是否已准备好                if (d.IsReady)                {                    Console.WriteLine("可以空间:{0}",d.TotalFreeSpace);                    Console.WriteLine("盘符格式:{0}",d.DriveFormat);                    Console.WriteLine("盘符卷标:{0}",d.VolumeLabel);                    Console.WriteLine();                }            }


二、文件基本操作

1  判断文件是否存在

2  创建文件
3  复制文件

    File.Copy("c://test.txt","d://test.txt"); 

 

    FileInfo finfo = new FileInfo("c://test.txt");
    finfo.CopyTo("d://test.txt", true);
4  移动文件 
    File.Move("c://test.txt","d://test.txt");
5  删除文件 
    File.Delete("c://test.txt");
6  获取文件基本信息 

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
                FileInfo finfo = new FileInfo(textBox1.Text);         //实例化FileInfo对象
                string strCTime, strLATime, strLWTime, strName, strFName, strDName, strISRead;
                long lgLength;
                strCTime = finfo.CreationTime.ToShortDateString();    //获取文件创建时间
                strLATime = finfo.LastAccessTime.ToShortDateString(); //获取上次访问该文件的时间
                strLWTime = finfo.LastWriteTime.ToShortDateString();  //获取上次写入文件的时间
                strName = finfo.Name;                                 //获取文件名称
                strFName = finfo.FullName;                            //获取文件的完整目录
                strDName = finfo.DirectoryName;                       //获取文件的完整路径
                strISRead = finfo.IsReadOnly.ToString();              //获取文件是否只读
                lgLength = finfo.Length;                              //获取文件长度
                MessageBox.Show("文件信息:/n创建时间:" + strCTime + " 上次访问时间:" + strLATime + "/n上次写入时间:" + strLWTime + " 文件名称:" + strName + "/n完整目录:" + strFName + "/n完整路径:" + strDName + "/n是否只读:" + strISRead + " 文件长度:" + lgLength);
            }

 


三、  文件夹基本操作 


1  判断文件夹是否存在
 
2  创建文件夹 
3  移动文件夹 
4  删除文件夹 
5  遍历文件夹 


四、  I/O(输入/输出) 


1  流概述

    流代表 在源文件和目标文件之间传输一定量的数据。


2  文件I/O流介绍


3  使用I/O流操作文本文件

     (1)、FileStream对象 读取或写入一个字节或字节组。

              FileStream类型缺点:需要操作原始字节。Encoding.Default.GetBytes 字符串转成字节数组

            //获取一个FileStream对象            using (FileStream fstream = File.Open(@"c:\myMessage.dat", FileMode.Create))            {                //字符串编码成字节数组                string msg = "Hello!";                byte[] msgAsByteArray = Encoding.Default.GetBytes(msg);                //把byte[]写入文件                fstream.Write(msgAsByteArray, 0, msgAsByteArray.Length);                //重置流内部位置                fstream.Position = 0;                //从文件读取字节并显示在控制台                byte[] bytesFromFile = new byte[msgAsByteArray.Length];                for (int i = 0; i < msgAsByteArray.Length; i++)                {                    bytesFromFile[i] = (byte)fstream.ReadByte();                    Console.WriteLine(bytesFromFile[i]);                }                //显示解码后的字符串                Console.WriteLine(Encoding.Default.GetString(bytesFromFile));            }


      (2)、StreamReader 和StreamWriter 读写基于字符(字符串)的数据。默认使用Unicode字符。
                    System.Text.Encoding对象 可以改变默认的Unicode编码

            using(StreamWriter writer=File.CreateText("reminders.txt"))            {                writer.WriteLine("AAAAA");                for (int i = 0; i < 10;i++ )                {                    writer.Write(i+" ");                }                //插入新行                writer.Write(writer.NewLine);            }            using (StreamReader sr = File.OpenText("reminders.txt"))            {                string input = null;                while ((input=sr.ReadLine())!=null)                {                    Console.WriteLine(input);                }            }            Console.ReadLine();

                    直接创建 StreamWriter/StreamReader类型

            using (StreamWriter writer = new StreamWriter("reminders.txt"))            {            }            using (StreamReader writer = new StreamReader("reminders.txt"))            {            }

          (3)、创建 StringWriter ,并把字符串数据写入内存

            //创建 StringWriter ,并把字符串数据写入内存            using(StringWriter strWriter=new StringWriter())            {                strWriter.WriteLine("AAA");                //获取内容副本(存储在字符串中)并向控制台输出                Console.WriteLine("内容字符串输出:{0}",strWriter);                using (StringReader strReader = new StringReader(strWriter.ToString()))                {                    string input = null;                    while ((input = strReader.ReadLine())!=null)                    {                        Console.WriteLine(input);                    }                }            }            Console.ReadLine();




4  使用I/O流操作二进制文件

        BinaryReader读取器,BinaryWriter编写器,
        从基层流中以简洁的二进制格式读取或写入离散数据类型.

            //为文件打开一个二进制编写器            FileInfo f = new FileInfo("BinFile.dat");            using(BinaryWriter bw=new BinaryWriter(f.OpenWrite()))            {                //输出BaseStream的类型(这里是System.Io.FileStream)                Console.WriteLine("基础流是:{0}",bw.BaseStream);                //文件中存储一些数据                double aDouble = 1234.67;                int anInt = 34567;                string aString = "A,B,C";                //写数据                bw.Write(aDouble);                bw.Write(anInt);                bw.Write(aString);            }            using(BinaryReader br=new BinaryReader(f.OpenRead()))            {                Console.WriteLine(br.ReadDouble());                Console.WriteLine(br.ReadInt32());                Console.WriteLine(br.ReadString());            }            Console.ReadLine();
效果:

BinFile.dat



五、  实战 


1  文件批量重命名的实现 
2  制作一个分割与合并文件工具


六、监控文件行为 FileSystemWatcher(监测文件什么时候创建,编辑,删除信息)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace MyDirectoryWatcher{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("***** The Amazing File Watcher App *****\n");            // Establish the path to the directory to watch.            FileSystemWatcher watcher = new FileSystemWatcher();            try            {                watcher.Path = @"C:\MyFolder";            }            catch (ArgumentException ex)            {                Console.WriteLine(ex.Message);                return;            }            // Set up the things to be on the lookout for.            watcher.NotifyFilter = NotifyFilters.LastAccess              | NotifyFilters.LastWrite              | NotifyFilters.FileName              | NotifyFilters.DirectoryName;            // Only watch text files.            watcher.Filter = "*.txt";            // Add event handlers.            watcher.Changed += new FileSystemEventHandler(OnChanged);            watcher.Created += new FileSystemEventHandler(OnChanged);            watcher.Deleted += new FileSystemEventHandler(OnChanged);            watcher.Renamed += new RenamedEventHandler(OnRenamed);            // Begin watching the directory.            watcher.EnableRaisingEvents = true;            // Wait for the user to quit the program.            Console.WriteLine(@"Press 'q' to quit app.");            while (Console.Read() != 'q') ;        }        static void OnChanged(object source, FileSystemEventArgs e)        {            // Specify what is done when a file is changed, created, or deleted.            Console.WriteLine("File: {0} {1}!", e.FullPath, e.ChangeType);        }        static void OnRenamed(object source, RenamedEventArgs e)        {            // Specify what is done when a file is renamed.            Console.WriteLine("File: {0} renamed to\n{1}", e.OldFullPath, e.FullPath);        }    }}


原创粉丝点击