C#文件流 System.IO和对文件的读写操作

 

System.IO命名空间中常用的非抽象类

BinaryReader 从二进制流中读取原始数据
BinaryWriter 从二进制格式中写入原始数据
BufferedStream 字节流的临时存储
Directory 有助于操作目录结构
DirectoryInfo 用于对目录执行操作
DriveInfo 提供驱动信息
File 有助于文件处理
FileInfo 用于对文件执行操作
FileStream 用于文件中任何位置的读写
MemoryStream 用于随机访问存储在内存中的数据流
Path 对路径信息执行操作
StreamReader 从字节流中读取数据
StreamWriter 用于向一个流中写入字符
StringWriter 用于读取字符串缓冲区
StringReader 用于写入字符串缓冲区

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FileStream类:

FileStream f = new FileStream("ont.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
FileMode表示打开的方式
  • append:打开一个已存在的文件,并将指针放在文件末尾。如果文件不存在那么创建一个新的文件。
  • create:创建一个新的文件。如果旧文件存在,那么删除旧文件创建新文件。
  • createnew:指定操作系统创建一个新的文件。如果文件已经存在,那么抛出异常。
  • open:打开一个文件。如果文件不存在抛出异常。
  • openorcreate:指定操作系统打开一个文件,如果文件不存在那么创建一个新文件。
  • Truncate:清空文件内容并打开文件,写入内容。如果文件不存在那么抛出异常。
FileAccess表示用来读/写和读/写权限 操作的模式有:read、Write、readwrite
FileShare类似文件锁的东西
  • Inheritable:使文件句柄可由子进程继承,win32不支持该功能。
  • None:谢绝(当前进程或者另一进程)共享当前文件。
  • read:允许随后打开文件读取。如果未定义此标签,在关闭该文件前,后续打开该文件进行读取的请求都将会失败。即使写了该标签,也需要相应的权限才能够访问改文件。
  • readwrite:允许随后打开或写入文件。如果未定义该标签,在关闭该文件前,后续打开该文件进行读取或者写入都将会失败。即使写了该标签,也需要相应的权限才能够访问该文件。
  • Write:允许随后写入文件。如果未定义该标签,在关闭该文件前,后续打开该文件进行写入都将会失败。即使写了该标签,也需要相应的权限才能够访问该文件。
  • delete:允许随后删除文件。

 

 

 

 

 

 

 

 

 

 

 

 

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * ================ Path ===============
            string file = @"D:acone.txt";
            Console.WriteLine(Path.GetDirectoryName(file));  // 获取文件的路径
            Console.WriteLine(Path.GetExtension(file));  // 获取文件扩展名
            Console.WriteLine(Path.GetFileName(file));  // 获取文件名(包含扩展)
            Console.WriteLine(Path.GetFullPath("123.txt"));  // 可以根据相对路径获取全路径
            Console.WriteLine(Path.GetRandomFileName());  // 随即返回一个文件名(不重复的文件名)
            Console.WriteLine(Path.GetTempPath());  // 返回一个临时目录
            Console.ReadKey();
            */
            /*
             * ========================= File ===============================
            string logName = "delete.txt";  // 文件名
            string filePath = Path.GetFullPath(logName);  // 获取全路径
            if (!File.Exists(filePath))
            {
                // 如果文件不存在
                File.Create(filePath).Close();  // 创建文件并且关闭
            }
            // 读取还可以使用 File.ReadAllLines(filePath)按行读取
            string logtext = File.ReadAllText(filePath);  // 读取文件
            Console.WriteLine(logtext);
            logtext += "
" + DateTime.Now.Date;
            Console.WriteLine(filePath);
            File.WriteAllText(filePath, logtext);  // 将内容写进文本
            Console.ReadKey();
            */
            /*
             * ======================= FileInfo ==============================
            string fileName = "delete.txt";
            string filePath = Path.GetFullPath(fileName);
            FileInfo fi = new FileInfo(fileName);  // 创建管理文件的软连接
            if (!fi.Exists)
            {
                Console.WriteLine("文件不存在!!!");
            }
            var writeThing = fi.AppendText();  // 追加方式
            writeThing.WriteLine(DateTime.Now.ToString());  // 追加文本
            writeThing.Close();  // 关闭
            var readThing = fi.OpenText();  // 读取
            Console.WriteLine(readThing.ReadToEnd());
            readThing.Close();  // 关闭
            Console.ReadKey();
            */
            /*
             * ================================== Directory ===========================================
            string filePath = @"F:下载C#完整版.NET教程(价值398元)4NetFramework【IT教程网】04NetFrameworkDay02";
            string fileP = filePath + @"abc";
            if (!Directory.Exists(fileP))
            {
                // 判断文件是否存在,如果文件不存在那么创建文件目录
                Directory.CreateDirectory(fileP);
            }
            foreach(var item in Directory.GetFiles(filePath)){
                Console.WriteLine(item);  // 输出该文件下的子文件名称
            }
            Console.WriteLine("
");
            foreach(var item in Directory.GetDirectories(filePath))
            {
                Console.WriteLine(item);  // 输出该目录下的子目录
            }
            Console.WriteLine(Directory.GetParent(filePath));  // 返回父类目录
            Console.ReadKey();
            */
            /*
             * ======================== DirectoryInfo ================================
            string filePath = @"F:下载C#完整版.NET教程(价值398元)4NetFramework【IT教程网】04NetFrameworkDay02";
            DirectoryInfo dir = new DirectoryInfo(filePath);
            dir.CreateSubdirectory(@"abcdefghkj");  // 可连续创建
            foreach (var item in dir.GetDirectories())
            {
                Console.WriteLine(item);  // 输出当前文件夹子目录
            }
            Console.WriteLine("
");
            foreach(var item in dir.GetDirectories())
            {
                Console.WriteLine(item);  // 输出当前文件夹子目录
            }
            Console.ReadKey();
            */
            /*
             * ================================== DriveInfo =================================
            // 对磁盘进行操作
            foreach(DriveInfo item in DriveInfo.GetDrives())
            {
                Console.WriteLine(item);  // 获取所有驱动的名称(显示磁盘的数量)
                Console.WriteLine(item.DriveType);  // 获取类型
                if (item.IsReady)
                {
                    // 判断磁盘是否准备就绪
                    Console.WriteLine(item.DriveFormat);  // 获取存储格式
                    Console.WriteLine(item.TotalSize);  // 获取磁盘大小,默认是比特单位
                    Console.WriteLine((item.TotalSize * 1.0) / (1024.0*1024.0*1024.0));  // 单位转换,KB/M/G
                    Console.WriteLine((item.TotalFreeSpace * 1.0) / (1024.0 * 1024.0 * 1024.0));  // 剩余可用路径,这里转换为G
                }
                Console.WriteLine();
            }
            Console.ReadKey();
            */
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            // 文件系统的监控 FileSystemWatcher
            FileSystemWatcher watcher = new FileSystemWatcher(@"F:下载C#完整版.NET教程(价值398元)4NetFramework【IT教程网】04NetFrameworkDay02");  // 监听该目录
            watcher.NotifyFilter = (NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName);  // 设置过滤器,LastAccess上一次打开的日期,LastWrite最后一次修改,FileName/DirectoryName文件名或者目录名的修改
            // 事件的注册
            watcher.Changed += new FileSystemEventHandler(OnChanged);  // 监听改变事件,函数OnChanged里面的事件
            watcher.Created += new FileSystemEventHandler(OnChanged);  // 监听创建事件,函数OnChanged里面的事件
            watcher.Deleted += new FileSystemEventHandler(OnChanged);  // 监听删除事件,函数OnChanged里面的事件
            watcher.Renamed += new RenamedEventHandler(OnRenamed);  // 监听重命名事件,函数OnChanged里面的事件
            watcher.Error += new ErrorEventHandler(OnError);  // 监听错误事件,函数OnError里面的事件
            watcher.EnableRaisingEvents = true;  // 启用组件
            Console.WriteLine("Press 'Enter' to exit...");
            Console.ReadKey();
        }
        // OnChanged事件
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            WatcherChangeTypes changeType = e.ChangeType;  // 获取发生的类型
            // e.FullPath获取文件路径及其文件名
            Console.WriteLine("The File {0}=>{1}", e.FullPath, changeType.ToString());
        }
        // OnRenamed事件
        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            WatcherChangeTypes changeType = e.ChangeType;
            // e.OldFullPath 获取改变前文件路径及其文件名
            Console.WriteLine("The File {0} {2} to {1}", e.OldFullPath, e.FullPath, changeType.ToString());
        }
        private static void OnError(object source, ErrorEventArgs e)
        {
            Console.WriteLine("An error has occurred.");
        }
    }
}

 

对文件的读写操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            // 不常用(实际不会这样子用)
            /*
            // 使用FileStream类来管理文件数据
            string overview = "Most commercial application, such as...";  // 定义写入的字符串
            FileInfo fileStore = new FileInfo("123.txt");  // 打开对应的文件,默认当前路径
            FileStream conduit = fileStore.Create();  // 创建
            byte[] encodedOverview = new UTF8Encoding(true).GetBytes(overview);  // encodedOverview数组格式的,将其进行编码
            conduit.Write(encodedOverview, 0, encodedOverview.Length);  // 将编码后的内容(第一个参数固定式byte数组)写进去,需要传递从那个位置开始,多长
            conduit.Close();  // 关闭
            */
            //
            /*
            // 使用MemoryStream类来管理内存数据
            byte[] overview = new UTF8Encoding(true).GetBytes("Most commercial application, such as...");  // 同样编码字符串
            MemoryStream conduit = new MemoryStream(overview.Length);  // 开辟内存空间
            conduit.Write(overview, 0, overview.Length);  // 进行写入,起始位置,长度
            Console.WriteLine(conduit.Position.ToString());  // 获取写入指针的当前位置
            conduit.Flush();  // 缓存的数据写进内存空间
            conduit.Seek(0, SeekOrigin.Begin);  // 将文件指正写入到首部
            // 读取
            byte[] overviewRead = new byte[conduit.Length];  // 创建内存流
            conduit.Read(overviewRead, 0, ((int)conduit.Length));  // 读取,从0开始读取,读取长度为((int)conduit.Length)
            Console.WriteLine(new UTF8Encoding().GetChars(overviewRead));
            conduit.Close();
            */
            //
            /*
            // 使用BufferedStream来提高流性能
            string overview = "Most commercial application, such as...";  // 字符串
            FileInfo fileStore = new FileInfo("123.txt");  // 打开文件
            FileStream conduit = fileStore.Create();  // 创建
            BufferedStream fileBuffer = new BufferedStream(conduit);  // 创建缓冲区
            byte[] encodedOverview = new UTF8Encoding(true).GetBytes(overview);  // 编码内容
            fileBuffer.Write(encodedOverview, 0, encodedOverview.Length);  // 写进缓冲区
            fileBuffer.Close();  // 关闭缓冲区
            conduit.Close();  // 关闭文件流
            */
            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // 常用(简便)
            //
            // 两大分类: 二进制文件、文本文件
            // 二进制文件区分BinaryReader/BinaryWriter
            // 文本文件又分为:文件、字符串。区分:StringReader/StringWriter
            //
            // 下面的文本文件读取
            /*
            // 不使用数据库和文件的情况下存储字符串
            StringBuilder sb = new StringBuilder();
            TextWriter tw = new StringWriter(sb);
            // 写内容(支持多种重载)
            tw.Write("您好,");
            tw.Write(123);
            tw.Write("	Data:{0}	", DateTime.Now);
            tw.WriteLine("bye!");
            // 读取操作
            TextReader tr = new StringReader(sb.ToString());  // 注意传递进去的是字符串
            Console.WriteLine(tr.ReadToEnd());  // 读取
            Console.ReadKey();
            */
            //
            /*
            // 对文件进行操作
            TextWriter tw = new StreamWriter("123.txt");  // 读取当前路径下的文件
            // 写入同上
            tw.Write("您好,");
            tw.Write(123);
            tw.Write("	Data:{0}	", DateTime.Now);
            tw.WriteLine("bye!");
            tw.Close();  // 关闭
            // 读取
            TextReader tr = new StreamReader("123.txt");
            Console.WriteLine(tr.ReadToEnd());
            // 下面是二进制的
            Stream sm = new FileStream("456.dat", FileMode.OpenOrCreate);  // 如果文件存在就打开文件,如果文件不存在那么创建并打开文件
            BinaryWriter bw = new BinaryWriter(sm);
            bw.Write(true);
            bw.Write(123);
            bw.Write("hello");
            bw.Close();
            sm.Close();
            // 读取
            BinaryReader sr = new BinaryReader(new FileStream("456.dat", FileMode.Open));
            bool b = sr.ReadBoolean();  // 读取bool
            int i = sr.ReadInt32();  // 读取整型
            string s = sr.ReadString();  // 读取字符串
            Console.WriteLine("bool值:{0},整型:{1},字符型:{2}", b, i, s);
            Console.ReadKey();
            sr.Close();
            // 注:值得注意的是二进制的读写一定要保持他们的顺序,不然会报错
            */
        }
    }
}

 

2019-8-3

/*
 * 用户: NAMEJR
 * 日期: 2019/8/3
 * 时间: 19:52
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace 文件读取
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        
        // 文件读取
        void Btn_ReadFileClick(object sender, EventArgs e)
        {
            // OpenFileDialog 打开文件对话框
            OpenFileDialog ofd = new OpenFileDialog();
            // ShowDialog:模态显示,显示时独占进程(不允许其它窗口显示),当窗口关闭,后续代码才会继续运行
            // Show:非模态显示,可以和其它窗口互相切换,后续代码不会停留
            if(ofd.ShowDialog()!= DialogResult.OK)
            {
                return;
            }
            //this.TB_Content.Text=File.ReadAllText(ofd.FileName,Encoding.Default);
            FileStream fs = new FileStream(ofd.FileName,FileMode.Open,FileAccess.Read);
            StreamReader sr = new StreamReader(fs,Encoding.Default);
            /*
            while(!sr.EndOfStream)
            {
                this.TB_Content.Text += sr.ReadLine();  // 单行读取
            }*/
            this.TB_Content.Text = sr.ReadToEnd();  // 全部输出
        }
        
        // 文件保存
        void Btn_SaveFileClick(object sender, EventArgs e)
        {
            // SaveFileDialog 保存文件对话框
            SaveFileDialog sfd = new SaveFileDialog();
            if(sfd.ShowDialog()!=DialogResult.OK)
            {
                return;
            }
            //File.WriteAllText(sfd.FileName,this.TB_Content.Text,Encoding.Default);
            StreamWriter sw = new StreamWriter(sfd.FileName,true,Encoding.Default);  // 第二个参数为true表示不覆盖(追加)
            sw.Write(this.TB_Content.Text);
            sw.Flush();
        }
    }
}

一句话写入:File.WriteAllText("D:/Code/Demo/Demo/upload/index.html", l_strXml);

AddBy 2019-10-24

using System;
using System.IO;

namespace 控制台
{
    class Program
    {
        static void Main(string[] args)
        {
            string l_strPath = @"D:文件资源1.xlsx";

            // 使用ReadAllText可以进行一次性读取出文档内容,并且指定编码
            //Console.WriteLine(File.ReadAllText(l_strPath, Encoding.GetEncoding("GB2312")));
            // 
            // 使用ReadToEnd
            FileStream l_fileStream = new FileStream(l_strPath, FileMode.Open);
            StreamReader l_streamReader = new StreamReader(l_fileStream);
            Console.WriteLine(l_streamReader.ReadToEnd());  // 也可以判断状态
            Console.ReadKey();
        }
    }
}

EndAddBy 2019-10-24

原文地址:https://www.cnblogs.com/namejr/p/10424242.html