1. 程式人生 > >C#中的檔案流總結

C#中的檔案流總結

檔案讀寫

C#和java對於檔案的操作的思路有點相似,都是採用管道技術和流操作—Stream來實現相應的功能.,開始操作檔案的時候用到檔案專用流:System.IO名稱空間下的Filestream.,其建構函式有很多,現在先介紹一個很常用的方法:

FileStream 建構函式 (String, FileMode);

FileMode有:open,create,openOrcreate,createnew.append, Truncate等幾種模式.

下面先看一個例子:

FileInfo mynewfile = new FileInfo("C:\\myfile.txt");//

FileStream sf = new FileStream(mynewfile.ToString(), FileMode.Create);//建構函式,以建立模式開啟目標檔案,如果不存在就建立相應的檔案.

byte[] dataArray = new byte[100000];//位元組

new Random().NextBytes(dataArray);//建立隨機位元組

for (int i = 0; i < dataArray.Length; i++)

{

sf.WriteByte(dataArray[i]);//將位元組寫入檔案理.

}

其他構造方法有:

我在這裡就不多介紹了,大家可以參考Msdn的檔案.關於檔案的讀寫還有個更好的StreamWriter/和StreamReader.下一節將繼續介紹.

FielStream類操作的是位元組和位元組陣列,字元資料易於使用,但是有些操作,比如隨機檔案訪問(訪問檔案中間某點的資料),就必須由FileStream物件執行。

FielStream類維護內部檔案指標,該指標指向檔案中進行下一次讀寫操作的位置。

FileStream只能處理原始位元組(raw byte),處理原始位元組的功能使用FileStream類可以用於處理任何資料檔案

一. FileStream詳解

1. (FileStream fs1 = File.Open("c:\\test.txt", FileMode.Open));

FileMode.Open 直接用FileStream類開啟檔案c:\\test.txt",

2. (FileStream fs2 = File.Open("c:\\test.txt", FileMode.Append, FileAccess.Write));

FileMode.Append,以追加的方式開啟檔案"c:\\test.txt",將某些內容寫到"c:\\test.txt"裡.

3.(FileStream fs3 =File.Open("c:\\test.txt", FileMode.Truncate, FileAccess.ReadWrite, FileShare.Read)).

FileMode.Truncate的意思是將檔案開啟清空裡面的內容後再對檔案進行操作..

4. FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create);

這個方法的意思是建立一個可以讀寫的檔案,並且可以允許其他人讀取檔案的內容.

二. C#基於流的輸入輸出.

C#基於流的輸入輸出.:Stream-通過C# I/O 系統與物理裝置連線起來,也就是平時讀寫的硬碟等物理存貯裝置.流/Stream的方法和屬性有:

Method/ Properties 描述
void Close() 關閉流
void Flush() 清理流中的內容
int ReadByte() 返回一個整數表示輸入的位元組數,如果沒有資料返回-1
int Read(byte[ ] buf,int offset, int numBytes) 將numBytes個位元組讀入到byte[ ]的以offset為,起始位置,返回讀入成功的位元組數
 
Long Seek(long offset,SeekOrigin origin) 將當前位置定位到以origin為初始位置以後的offset處.
void WriteByte(byte b) 將單個位元組寫入到一個輸出流.
void Write(byte[ ] buf,int offset, int numBytes) 寫入byte[ ] buf中從offset開始的numBytes個位元組.
bool CanRead 是否可讀
bool CanSeek 是否支援定址
bool CanWrite 是否可以寫入資料
long Length 流的長度
long Position 流的當前位置.

三. 流的繼承結構

Stream是一個很大類的,在讀寫檔案的時候,可以通過不同的流進行專業的資料讀寫.

The FileMode and FileAccess的幾條規則:

Value 意義
FileMode.Create 建立檔案,之前存在同名的檔案將被毀掉
FileMode.CreateNew 建立新檔案,這個檔案之前不存在
FileMode.Open 開啟已經存在的檔案
FileMode.OpenOrCreate 開啟檔案如果存在,否則建立新檔案
FileMode.Truncate 開啟以存在的檔案,將它的內容清除掉
FileMode.Append 以追加的形式將資料寫入到檔案的最後

如果在開啟檔案的時候想限制檔案訪問許可權,那麼可以做如下的構造方法:

FileStream(string filename, FileMode mode, FileAccess access);

     檔名       檔案模式       操作模式

Access可以是以下當中的一個值:

FileAccess.Read/  FileAccess.Write/  FileAccess.ReadWrite;

FileStreamfs=new FileStream(“c:\\tab.txt”,FileMode.OpenOrCreate,FileAccess.Read);


C#中的StreamReader/StreamWriter

在讀寫檔案的過程中,Filestream只可以進行以位元組為單位原始資料流進行讀寫操作,為此,C#中提供了功能更加強大的StreamReader/ StreamWriter來支援檔案的讀寫. StreamReader/ StreamWriter可以進行以字元為單位的資料讀寫操作..

一. 用StreamReader的建構函式

StreamReader有很多的建構函式:在這裡只列出兩個常用和比較常見的

StreamReader  sr=new StreamReader (Stream); Stream可以是Filestream;

StreamReader  sr=new StreamReader (String); String為指定的檔名初始化 StreamReader 類的新例項。

例如:

//demo1

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamReader sr = new StreamReader(filest);

//demo2

StreamReader another = new StreamReader(@"c:\abc.txt");

兩個StreamReader都指向同一個檔案.

StreamReader讀取檔案中的資料的程式碼:

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);

StreamReader sr = new StreamReader(filest);

string strLine = sr.ReadLine();//讀取檔案中的一行

while(strLine!=null)//判斷是否為空,表示到檔案最後一行了

{

Console.WriteLine(strLine);

strLine = sr.ReadLine();

}

sr.Close();//關閉流

filest.Close();
 

程式執行結果和盤中abc.txt檔案中的內容比較如下:

二. StreamWriter

StreamWriter 專門用於的向檔案中寫資料的,它和StreamReader類似,只是一個負責向檔案中寫資料,一個負責向檔案中讀資料而已.

StreamWriter 建構函式也有很多.在這裡只舉例兩個建構函式.

StreamWriter  sr=new StreamWriter (Stream); Stream可以是Filestream;

StreamWriter  sr=new StreamWriter (String); String為指定的檔名初始化StreamWriter 類的新例項。

例如:

//demo1

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter (filest);

//demo2

StreamWriter another = new StreamWriter (@"c:\abc.txt");下面的例子可以讓大家掌握寫檔案的方法.

FileStream filewriter = new FileStream(@"C:\abc.txt", FileMode.Append, FileAccess.Write);

以追加的方式開啟檔案,並進行寫入操作.

StreamWriter sw = new StreamWriter(filewriter); 建構函式;

for (char mychar = 'a'; mychar <= 'z'; mychar++)

{

sw.Write(mychar);//將從a—z26個小寫字母寫入檔案中.

}

sw.Close();filewriter.Close();

//demo

FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);

StreamReader sr = new StreamReader(filest);

string strLine = sr.ReadLine();

while(strLine!=null)

{

Console.WriteLine(strLine);

strLine = sr.ReadLine();

}

sr.Close();

filest.Close();

這篇主要介紹幾個操作檔案流的類,讀寫類StreamReader,StreamWriter和File類以及Directory類的操作

FileStream類的控制

(1) Flush();  清除此流的緩衝區,是為了保護硬碟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void Main(string[] args)
{
            using (FileStream filewrite = new FileStream("file.txt", FileMode.Create, FileAccess.Write))
            {
                filewrite.WriteByte(101);
                filewrite.WriteByte(101);
                //清除此流的緩衝區
                filewrite.Flush();
                filewrite.WriteByte(101);
                filewrite.WriteByte(101);
                //每次寫一個直接就會頻繁的操作硬碟,
            }
}

(2)Seek(偏移,位置列舉)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void Main(string[] args)
{
            using (FileStream fileRead = new FileStream("file.txt", FileMode.Open, FileAccess.Read))
            {
                fileRead.Position = 4;
                fileRead.Seek(3, SeekOrigin.Current);
                int n = fileRead.ReadByte();
                Console.WriteLine((char)n);
            }

其它流

(1)MemoryStream 記憶體流

            NetworkStream ns = new NetworkStream();

(2)NetworkStream 網路流

            MemoryStream ms = new MemoryStream();

讀寫流

(1) StreamReader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//讀取檔案流
        static void Main(string[] args)
        {
            using(FileStream fileRead=new FileStream("成功.txt",FileMode.Open,FileAccess.Read))
            {
                using (StreamReader sr = new StreamReader(fileRead,Encoding.Default))
                {
                    //第一種讀法
                    //string str = sr.ReadLine();
                    //while ((str = sr.ReadLine()) != null)
                    //{
                    //    Console.WriteLine(str);
                    //}
                    //第二種讀法
                    Console.WriteLine(sr.ReadToEnd());