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:\a\b\c\one.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 += "\r\n" + 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元)\04NetFramework\【IT教程網】04NetFramework\Day02";
            string fileP = filePath + @"\abc";
            if (!Directory.Exists(fileP))
            {
                // 判斷文件是否存在,如果文件不存在那么創建文件目錄
                Directory.CreateDirectory(fileP);
            }
            foreach(var item in Directory.GetFiles(filePath)){
                Console.WriteLine(item);  // 輸出該文件下的子文件名稱
            }
            Console.WriteLine("\r\n");
            foreach(var item in Directory.GetDirectories(filePath))
            {
                Console.WriteLine(item);  // 輸出該目錄下的子目錄
            }
            Console.WriteLine(Directory.GetParent(filePath));  // 返回父類目錄
            Console.ReadKey();
            */
            /*
             * ======================== DirectoryInfo ================================
            string filePath = @"F:\下載\C#完整版.NET教程(價值398元)\04NetFramework\【IT教程網】04NetFramework\Day02";
            DirectoryInfo dir = new DirectoryInfo(filePath);
            dir.CreateSubdirectory(@"ab\cd\ef\gh\kj");  // 可連續創建
            foreach (var item in dir.GetDirectories())
            {
                Console.WriteLine(item);  // 輸出當前文件夾子目錄
            }
            Console.WriteLine("\n");
            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元)\04NetFramework\【IT教程網】04NetFramework\Day02");  // 監聽該目錄
            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("\tData:{0}\t", 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("\tData:{0}\t", 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM