1. 程式人生 > >關於C# IO的使用

關於C# IO的使用

一、對於檔案的操作

對於檔案的操作,C#中就比較豐富了

FileSystemInfo
	FileInfo
	DirectoryInfo
File,Directory,DriverInfo, Path
對於檔案、目錄的操作是分開的,分別提供了靜態類與普通類

二、對於檔案讀寫的操作

首先C#與Java不同的地方,不再區分字元流、位元組流,而統一採用Stream方式,然後針對Stream提供Reader與Writer的相關操作。

其類的個數也沒有Java多

下面看看統計的相關類:

System.IO.Stream
  System.IO.BufferedStream
  System.IO.FileStream
  System.IO.MemoryStream
  System.Net.Sockets.NetworkStream
  System.Net.Sockets.UnmanagedMemoryStream
      System.IO.MemoryMappedFiles.MemoryMappedViewStream
  System.Security.Cryptography.CryptoStream
  System.IO.Compression.DeflateStream
  System.IO.Compression.GZipStream
  System.Net.Security.AuthenticatedStream
      System.Net.Security.NegotiateStream
      System.Net.Security.SslStream
  System.IO.Pipes.PipeStream
      System.IO.Pipes.AnonymousPipeServerStream
      System.IO.Pipes.AnonymousPipeClientStream
      System.IO.Pipes.NamedPipeServerStream
      System.IO.Pipes.NamedPipeClientStream
  System.Data.SqlTypes.SqlFileStream

System.IO.TextWriter
	System.IO.StringWriter
	System.IO.StreamWriter


System.IO.TextReader
	System.IO.StringReader
	System.IO.StreamReader

System.IO.BinaryWriter
System.IO.BinaryReader
上面的統計估計不是很完全,很可惜目前沒有找到一張類圖來展示

三、檔案相關類的常用操作

1、檢視檔案驅動器以及下面的檔案目錄資訊

using System;
using System.IO;
using System.Security.AccessControl;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                new Program().PrintFileTree();
                Console.Read();
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
            }
        }

        /// <summary>
        /// 列印所有驅動器資訊(包含裡面的目錄、檔案)
        /// </summary>
        public void PrintFileTree()
        {
            DriveInfo[] drivers = DriveInfo.GetDrives();
            foreach (DriveInfo item in drivers)
            {
                if (item.DriveType == DriveType.CDRom)//光碟機
                {
                    Console.WriteLine("光碟機:" + item.Name);
                }
                else if (item.DriveType == DriveType.Fixed)//固定磁碟
                {
                    Console.WriteLine("固定磁碟:" + item.Name + "__" + item.RootDirectory);
                    PrintFileTree(item.RootDirectory);
                }
                else if (item.DriveType == DriveType.Network)//網路驅動器
                {
                    Console.WriteLine("網路驅動器:" + item.Name);
                }
                else if (item.DriveType == DriveType.NoRootDirectory)//驅動器沒有根目錄
                {
                    Console.WriteLine("驅動器沒有根目錄:" + item.Name);
                }
                else if (item.DriveType == DriveType.Ram)//RAM磁碟
                {
                    Console.WriteLine("RAM磁碟:" + item.Name);
                }
                else if (item.DriveType == DriveType.Removable)//可移動磁碟(軟碟機或者U盤等)
                {
                    Console.WriteLine("可移動磁碟(軟碟機或者U盤等):" + item.Name);
                }
                else if (item.DriveType == DriveType.Unknown)//未知型別
                {
                    Console.WriteLine("未知型別:" + item.Name);
                }
            }
        }
        /// <summary>
        /// 遞迴列印目錄下面的資訊
        /// </summary>
        /// <param name="dir">上級目錄</param>
        public void PrintFileTree(DirectoryInfo dir)
        {

            //FileSystemAccessRule fsRule = new FileSystemAccessRule(System.Environment.UserName, FileSystemRights.Read, AccessControlType.Allow);

            ////新增安全訪問規則 
            //DirectorySecurity dirSecurity = dir.GetAccessControl();
            //dirSecurity.AddAccessRule(fsRule);
            //dir.SetAccessControl(dirSecurity);

            //dir.GetAccessControl().GetAuditRules(true, true, typeof(System.Security.Principal.NTAccount));

            bool flag = true;
            foreach (FileSystemAccessRule item in dir.GetAccessControl().GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
            {
                //拒絕讀
                if (item.FileSystemRights == FileSystemRights.Read && item.AccessControlType == AccessControlType.Deny)
                {
                    flag = false;
                    break;
                }
            }

            if (flag)
            {
                FileInfo[] files = dir.GetFiles();
                foreach (FileInfo item in files)
                {
                    Console.WriteLine(item.FullName);
                }

                DirectoryInfo[] dirs = dir.GetDirectories();
                foreach (DirectoryInfo item in dirs)
                {
                    Console.WriteLine(item.FullName);
                    PrintFileTree(item);
                }
            }

            ////移除安全訪問規則
            //dirSecurity = dir.GetAccessControl();
            //dirSecurity.RemoveAccessRule(fsRule);
            //dir.SetAccessControl(dirSecurity);           
        }
    }
}

2、常用檔案操作方法

        public void Test1()
        {
            //寫檔案
            FileStream file = new FileStream("C:\\test1.txt", FileMode.OpenOrCreate);

            String text = @"更加務實的Surface
                          負責Surface業務的副總裁Panos Panay表示,他們的目標不是重新發明輪子,而是要大力改進它。從這句話也可以看得出,
                            這一代Surface不會給人們帶來任何驚豔,取而代之的是務實的修改風,比如克服續航短板,帶來更高的移動工作能力等。";
            byte[] array = System.Text.Encoding.UTF8.GetBytes(text);
            file.Write(array, 0, array.Length);
            file.Close();

            //讀檔案
            array = new byte[1024];
            file = new FileStream("C:\\test1.txt", FileMode.Open);
            while (file.Read(array, 0, 1024) > 0)
            {
                Console.Write(System.Text.Encoding.UTF8.GetString(array));
            }
            file.Close();
            Console.WriteLine("Test1完成操作");
        }

        public void Test2()
        {
            FileStream stream = new FileStream("C:\\test2.txt", FileMode.OpenOrCreate);
            StreamWriter writer = new StreamWriter(stream);
            writer.AutoFlush = true;
            for (int i = 0; i < 10; i++)
            {
                writer.WriteLine("不是重新發明輪子___" + i.ToString());
            }
            writer.Flush();
            writer.Close();
            stream.Close();


            StreamReader reader = new StreamReader("C:\\test2.txt");
            String str = String.Empty;
            while ((str = reader.ReadLine()) != null)
            {
                Console.WriteLine(str);
            }

            reader.Close();

            Console.WriteLine("Test2完成操作");

        }

        public void Test3()
        {
            //寫檔案
            FileStream file = new FileStream("C:\\test3.txt", FileMode.OpenOrCreate);
            BufferedStream writer = new BufferedStream(file, 1024);

            String text = @"要承認的是,裝置的融合必將是未來的一種趨勢,如今眾多形態的計算裝置,
                    如膝上型電腦、超級本和平板電腦未來很有可能融合成一個裝置,這些裝置的融合先決條件就是出現一個裝置能將這些裝置的形態和功能這兩者囊括在一箇中,
                    值得高興的是,Surface就是擁有這種潛力的裝置";
            byte[] array = System.Text.Encoding.UTF8.GetBytes(text);
            writer.Write(array, 0, array.Length);
            writer.Flush();
            writer.Close();
            file.Close();

            //讀檔案
            file = new FileStream("C:\\test3.txt", FileMode.Open);
            BufferedStream reader = new BufferedStream(file, 1024);

            array = new byte[1024];
            while (reader.Read(array, 0, 1024) > 0)
            {
                Console.Write(System.Text.Encoding.UTF8.GetString(array));
            }
            reader.Close();
            file.Close();

            Console.WriteLine("Test1完成操作");

        }

3、打檔案複製操作方法
   public void BigFileCopy()
        {
            //每次讀取的位元組數  
            int MAX_BYTE = 1024 * 1024;
            byte[] array = new byte[MAX_BYTE];


            FileStream reader = new FileStream("C:\\infile.avi", FileMode.Open);
            FileStream writer = new FileStream("C:\\outfile.avi", FileMode.OpenOrCreate);

            //迴圈讀取
            long total = reader.Length;
            for (long i = 0; i < total / MAX_BYTE; i++)
            {
                reader.Read(array, 0, MAX_BYTE);
                writer.Write(array, 0, MAX_BYTE);
                writer.Flush();
            }

            //不能整除導致剩餘資料
            int level = (int)(total % MAX_BYTE);

            reader.Read(array, 0, level);
            writer.Write(array, 0, level);
            writer.Flush();

            //關閉流
            reader.Close();
            writer.Close();
            Console.WriteLine("BigFileCopy完成操作");
        }


………………………………

相關推薦

C# IO 隨筆

基本 tex nor 文件的 c# reat col 信息 並集 File類 1.用File.Create創建文件,會返回一個FileStream對象,如果不關閉這個對象,無法用File.AppendAllText追加文本   報錯示例:    File.Create("D

C++IO庫 - 隨便記點什麼

1. C++使用標準庫類來處理面向流的輸入和輸出:     iostream 處理控制檯IO;     fstream處理命名檔案IO;     stringstream完成記憶體string 的IO;

c++ io 流操作 以及字串操作

字元流操作如下: #include <fstream> void main(){ char* fname = "D://dest.txt"; //開啟輸出流 ofstream fout(fname); //建立失敗 if (fout.bad

C++ IO庫的使用

IO類:iostream定義了用於讀寫流的基本型別fstream 定義了讀寫命名檔案的型別。sstream 定義了讀寫記憶體string物件的型別。std::ios::in  std::ios::binary 的作用>>運算子,用來從一個istream物件讀取輸入

關於C# IO的使用

一、對於檔案的操作 對於檔案的操作,C#中就比較豐富了 FileSystemInfo FileInfo DirectoryInfo File,Directory,DriverInfo, Path 對於檔案、目錄的操作是分開的,分別提供了靜態類與普通類 二、對於檔

C#IO流詳解

17.3.3 流的文字讀寫器 StreamReader和StreamWriter主要用於以文字方式對流進行讀寫操作,它們以位元組流為操作物件,並支援不同的編碼格式。 StreamReader和StreamWriter通常成對使用,它們的建構函式形式也一一對應。可以通過指定檔名或指定另一個流物件來建立Strea

C#IO 檔案讀取筆記一(File類和Directory類相關屬性,FileInfo類和DirectoryInfo類)

今天在這裡總結一下,有關C#讀取檔案的知識: 首先所有的類幾乎都是繼承自System.IO這個名稱空間 首先是File類和DIrectory類,這兩個類都提供了很多的靜態方法,用於處理我呢見和目錄。這些方法可以移動檔案、查詢和更新特性,還可以建立FileStream物件,

探尋C++最快的讀取檔案的方案 C++ IO優化

 在競賽中,遇到大資料時,往往讀檔案成了程式執行速度的瓶頸,需要更快的讀取方式。相信幾乎所有的C++學習者都在cin機器緩慢的速度上栽過跟頭,於是從此以後發誓不用cin讀資料。還有人說Pascal的read語句的速度是C/C++中scanf比不上的,C++選手只能乾著急。難

C++ IO流:檔案流seekp()/seekg()、tellp()/tellg()

一、程式碼         fstream         seekp()、seekg()         tellp()、tellg() 1.1 檔案template.c         需要事先準備好的檔案內容:         wc  -c  template.c

C++ IO流的概念及流類庫、檔案操作

IO流的概念及流類庫 當程式與外界進行資訊交換時,存在兩個物件,一個是程式中的物件,另一個是檔案物件。 流是資訊流動的一種抽象,它負責在資料的生產者和資料的消費者之間建立聯絡,並管理資料的流動 流物件與檔案操作 程式建立一個流物件

C# IO有關操作

一.讀取文字檔案 1/**//// <summary>  2/// 讀取文字檔案  3/// </summary>  4private void ReadFromTxtFile()  5{  6    if(filePath.PostedFile.FileName != "")  7 

C++IO流檔案指標

預編譯器內建巨集 __LINE__ 行數 __TIME__ 時間 __FUNCTION__ 函式 __FINE__ 檔名 呼叫 void ioStreamPoint() { char write_buf[32]

c++中IO輸入輸出流總結<二>

操作 clu 文件 blog trunc pub filename binary team 1 文件的打開和關閉 1.1 定義流對象   ifsteam iflie;//文件輸入流對象   ifsteam iflie;//文件輸出流對象   fsteam iflie;//文

C後端設計開發 - 第7章-真氣-遺失的網絡IO

com itl ron alt book blank nbsp 如果 tree 正文   第7章-真氣-遺失的網絡IO 後記   如果有錯誤, 歡迎指正. 有好的補充, 和疑問歡迎交流, 一塊提高. 在此謝謝大家了. ボクらの冒

C中異步IO淺析之一:基於AIO_ABI的異步IO

c語言 異步io aio_write 相較於同步IO,異步IO請求發出後,應用程序不用阻塞,可以繼續執行後面的業務流程,因此能夠極大提高系統並發度和吞吐率。這也是為何許多SAN服務後端數據落盤常常采用異步IO讀寫的原因。 C語言中提供了兩套實現異步IO的方法,根據個人的理解,可以分為原生的AIO_

C中異步IO淺析之三:深入理解異步IO的基本數據結構

c 異步io libaio 一個函數庫或一段代碼的數據結構之間的關系,既展示了數據的行蹤,同時又隱含了函數的調用順序和使用方法。libaio內部的多個數據結構尤其如此,哪怕我們找不到文檔或者幫助手冊,只要深刻領悟頭文件中定義的數據結構及其內在聯系,再加一點代碼的驗證,就可以達到對libaio的A

C#使用System.IO.Path獲取文件路徑、文件名

filepath 目錄 tle provide volume 指示 完整路徑 nat col class Program { static void Main(string[] args) { //獲取

C 標準庫IO緩沖區和內核緩沖區的區別

io緩沖區 lose 信息 同一文件 upload 同步 load IT 覆蓋 1.C標準庫的I/O緩沖區 UNIX的傳統 是Everything is a file,鍵盤、顯示器、串口、磁盤等設備在/dev 目錄下都有一個特殊的設備文件與之對應,這些設

C#文件操作(IO流 摘抄)

引用 file HA 參考 dto RM 附加 文件系統格式 失敗 11 文件操作概述 11.1 驅動器 在Windows操作系統中,存儲介質統稱為驅動器,硬盤由於可以劃分為多個區域,每一個區域稱為一個驅動器。.NET Framework提供DriveInfo類和

C++ Final Project代寫代做、代寫C++ socket, IO編程

sele work UC pig load computer .net 回歸 side C++ Final Project代寫代做、代寫C++ socket, IO編程DescriptionThe final project is an open style one. It