
















Preview text:
1. Lớp Path 
Lớp Path cung cấp cho chúng ta các phương thức tĩnh tiện ích nhằm thao tác với đường 
dẫn của tập tin hoặc thư mục. Một vài phương thức phổ biến trong Path là: 
 Combine: Kết hợp một mảng các đường dẫn với nhau và trả về một đường dẫn duy nhất. 
Ví dụ: Path.Combine(@”C:\abc\”, @”efg\file.txt”); sẽ trả về C:\abc\efg\file.txt 
 GetDirectoryName: Trả về đường dẫn đến thư mục chứa tập tin trong đường dẫn đó. Ví 
dụ: Path.GetDirectoryName(@”C:\abc\file.txt”) sẽ trả về chuỗi C:\abc 
 GetExtension: Trả về phần mở rộng của tập tin được chỉ định. Ví dụ: 
Path.GetExtension(“Download.rar”) sẽ trả về chuỗi “.rar” 
 GetFileName: Lấy tên của tập tin từ đường dẫn được chỉ định. Tên tập tin được trả về sẽ 
bao gồm cả phần mở rộng. Nếu chỉ muốn lấy tên không thôi thì sử dụng phương thức  GetFileNameWithoutExtension 
 GetFullPath: Trả về đường dẫn đầy đủ đến tập tin được chỉ định. Đường dẫn này sẽ dựa 
trên thư mục hiện tại của ứng dụng chạy.  2. Thư mục: 
.NET Framework cung cấp cho chúng ta namespace System.IO để làm việc với thư mục 
và tập tin trên máy tính. 
Lớp Directory có nhiều phương thức dành cho việc tạo, di chuyển, duyệt thư mục. Các 
phương thức trong lớp Directory đều là phương thức tĩnh;vì vậy không cần phải tạo một thể hiện 
lớp Directory mà có thể truy xuất trực tiếp từ tên lớp. 
Lớp DirectoryInfo là lớp tương tự như lớp Directory. Nó cung các tất cả các phương 
thức mà lớp Directory có đồng thời bổ sung nhiều phương thức hữu ích hơn cho việc duyệt cấu 
trúc cây thư mục. Lớp DirectoryInfo không có phương thức tĩnh, vì vậy cần tạo một thể hiện lớp 
trước khi sử dụng các phương thức. 
Các phương thức lớp Directory   
Các phương thức/property lớp    DirectoryInfo  
Để duyệt cấu trúc cây thư mục, ta cần tạo một thể hiện của lớp DirectoryInfo. Lớp 
DirectoryInfo không chỉ cung cấp phương thức lấy về tên các tập tin và thư mục con chứa trong 
một thư mục mà còn cho phép lấy về các đối tượng FileInfo và DirectoryInfo, cho phép ta thực 
hiện việc quản lý các cấu trúc cây thư mục, hay thực hiện các thao tác đệ qui. 
Khởi tạo một đối tượng DirectoryInfo bằng tên của thư mục muốn tham chiếu. 
DirectoryInfo dir = new DirectoryInfo(@"C:\winNT");  Ví dụ:  3. Tập tin: 
Đối tượng DirectoryInfo cũng trả về danh sách các đối tượng FileInfo là các tập tin chứa 
trong thư mục. Các đối tượng này mô tả thông tin về tập tin. Thư viện .NET cũng cung cấp hai 
lớp File và FileInfo tương tự như với trường hợp thư mục. Lớp File chỉ có các phương thức tĩnh 
và lớp FileInfo thì không có phương thức tĩnh nào cả. 
Các phương thức lớp File   
Các phương thức/property lớp FileInfo   
Đối tượng FileInfo có thể dùng để tạo, sao chép, đổi tên và xoá một tập tin. 
4. Đọc và ghi dữ liệu: 
Đọc và ghi dữ liệu là nhiệm vụ chính của các luồng, Stream. Stream hỗ trợ cả hai cách 
đọc ghi đồng bộ hay bất đồng bộ. .NET Framework cung cấp sẵn nhiều lớp thừa kế từ lớp 
Stream, bao gồm FileStream, MemoryStream và NetworkStream. Ngoài ra còn có lớp 
BufferedStream cung cấp vùng đệm xuất nhập được dùng thêm với các luồng khác.  Ý nghĩa các luồng    4.1 Tập tin nhị phân: 
Sử dụng lớp cơ sở Stream để đọc tập tin nhị phân. Lớp Stream có rất nhiều phương thức 
nhưng quan trọng nhất là năm phương thức Read(), Write(), BeginRead(), BeginWrite() và  Flush(). 
Để thao tác tập tin nhị phân (hay đọc tập tin theo kiểu nhị phân), ta bắt đầu tạo một cặp 
đối tượng Stream, một để đọc, một để viết.  Ví dụ: 
Stream inputStream = File.OpenRead(@"C:\test\source\test1.cs"); 
Stream outputStream = File.OpenWrite(@"C:\test\source\test1.bak"); 
Để mở một tập tin để đọc và viết, ta sử dụng hai hàm tĩnh OpenRead() và OpenWrite() 
của lớp File với tham số là đường dẫn tập tin. 
Tiếp theo ta đọc dữ liệu từ inputStream cho đến khi không còn dữ liệu nữa và sẽ ghi dữ 
liệu đọc được vào outputStream. Hai hàm lớp Stream phục vụ việc đọc ghi dữ liệu là Read() và  Write().  Ví dụ: 
while( (bytesRead = inputStream.Read(buffer,0,SIZE_BUFF)) > 0 )  { 
outputStream.Write(buffer,0,bytesRead);  } 
 buffer - một mảng các byte (được gọi là vùng đệm buffer) dùng để chứa dữ liệu theo  dang byte; 
 tham số thứ hai cho biết vị trí bắt đầu đọc hay ghi trên vùng đệm; 
 tham số cuối cùng cho biết số byte cần đọc hay ghi. 
Ví dụ: Cài đặt việc đọc và ghi tập tin nhị phân  using System;  using System.IO;  namespace Programming_CSharp  {    class Tester    {      const int SizeBuff = 1024;      public static void Main( )      {        Tester t = new Tester( );        t.Run( );      }      private void Run( )      {        // đọc từ tập tin này       
Stream inputStream = File.OpenRead(@"C:\test\source\test1.cs");        // ghi vào tập tin này       
Stream outputStream = File.OpenWrite(@"C:\test\source\test1.bak");       
// tạo vùng đệm chứa dữ liệu       
byte[] buffer = new Byte[SizeBuff];        int bytesRead;       
// sau khi đọc dữ liệu xuất chúng ra outputStream       
while ( (bytesRead = inputStream.Read(buffer,0,SizeBuff)) > 0 )        {         
outputStream.Write(buffer,0,bytesRead);        }       
// đóng tập tin trước khi thoát        inputStream.Close( );        outputStream.Close( );      }    }  }  4.2 Tập tin văn bản 
Đối với các tập tin chỉ chứa văn bản, ta sử dụng hai luồng StreamReader và StreamWriter 
cho việc đọc và ghi. Hai lớp này được thiết kế để thao tác với văn bản dễ dàng hơn. Ví dụ như 
chúng cung cấp hàm ReadLine() và WriteLine() để đọc và ghi một dòng văn bản. 
Để tạo một thể hiện StreamReader ta gọi phương thức OpenText() của lớp FileInfo và 
đọc từng dòng văn bản của tập tin cho đến hết  Ví dụ: 
FileInfotheSourceFile = new FileInfo (@"C:\test\source\test1.cs"); 
StreamReader stream = theSourceFile.OpenText( );  do  {  text = stream.ReadLine( );  }  while (text != null);   
Để tạo đối tượng StreamWriter ta truyền cho hàm khởi dựng đường dẫn tập tin, trong đó 
tham số thứ hai thuộc kiểu bool, nếu tập tin đã tồn tại, giá trị true sẽ ghi dữ liệu mới vào cuối tập 
tin, giá trị false sẽ xóa dữ liệu cũ, dữ liệu mới sẽ ghi đè dữ liệu cũ.  Ví dụ: 
StreamWriter writer = new StreamWriter(@"C:\test\source\folder3.bak", false);  Ví dụ:  using System;  using System.IO;  namespace Programming_CSharp  {    class Tester    {      public static void Main( )      {        Tester t = new Tester( );        t.Run( );      }      private void Run( )      {        // mở một tập tin       
FileInfo theSourceFile = new FileInfo(@"C:\test\source\test.cs");       
// tạo luồng đọc văn bản cho tập tin       
StreamReader reader = theSourceFile.OpenText( );       
// tạo luồng ghi văn bản cho tập tin xuất       
StreamWriter writer= new StreamWriter(@"C:\test\source\test.bak",false);       
// tạo một biến chuỗi lưư giữ một dòng văn bản        string text;       
// đọc toàn bộ tập tin theo từng dòng       
// ghi ra màn hình console và tập tin xuất        do        {          text = reader.ReadLine();  writer.WriteLine(text);  Console.WriteLine(text);        }        while (text != null);        // đóng tập tin        reader.Close();        writer.Close();      }    }  }  5. Thao tác với XML 
5.1 Mở một tài liệu xml 
Để mở một tài liệu XML, bạn cần sử dụng lớp XmlDocument. Lớp XmlDocument cho 
phép bạn mở tài liệu XML theo 3 cách thông dụng sau: 
 Bạn có thể mở thông qua 1 đường dẫn trên ổ cứng, một URL, hoặc 1 tập tin XML. 
 Bạn có thể sử dụng đối tượng stream như FileStream chứa dữ liệu của tài liệu XML. 
 Bạn có mở thông qua 1 chuỗi chứa XML trong bộ nhớ 
Ví dụ: Ứng dụng của chúng ta bao gồm: 3 radio button cho việc chọn nơi chứa tài liệu mà lớp 
XmlDocument sẽ mở. 1 textbox dùng để nhập đường dẫn đến tập tin xml, hoặc URL hoặc 1 
string chứa chuỗi XML. Cuối cùng là 1 button dùng để thực thi các câu lệnh để mở tài liệu. Sau 
đây là đoạn code thụ lý tình huống Click của button: 
private void Button1_Click(object sender, System.EventArgs e)  {    try    {      string path = TextBox1.Text;     
XmlDocument document = new XmlDocument();     
if (RadioButton1.Checked == true)      {        document.Load(path);      }     
if (RadioButton2.Checked == true)      {        System.IO.FileStream fs;       
fs = System.IO.File.OpenRead(path);        document.Load(fs);      }     
if (RadioButton3.Checked == true)      {        document.Load(path);      }     
MessageBox.Show("Mở tài liệu XML thành công!");    }    catch (Exception ex)    {      MessageBox.Show(ex.Message);    }  } 
Đoạn code trên tạo 1 thể hiện của lớp XmlDocument. Lớp này có 2 phương thức quan 
trọng là: Load() và LoadXml(). Như bạn đã thấy, các đối số mà phương thức Load() nhận có thể 
là: 1 chuỗi chứa URL chứa tài liệu xml, hoặc 1 stream, hoặc 1 chuỗi chứa tài liệu XML. 
5.2 Di chuyển xuyên qua tài liệu xml 
Một tài liệu XML bao gồm 1 hoặc nhiều nút, và có những nút nằm bên trong nút khác. 
Những nút nằm bên trong nút khác gọi là nút con. 
Lớp XmlNode có 1 tập hợp gọi là ChildNodes mà chứa danh sách tất cả các nút con của 
một nút bất kỳ. Ngoài ra, chúng còn có các thuộc tính: ParentNode, FirstChild, LastChild, 
NextSibling và PreviousSibling mà cho phép bạn di chuyển đến bất kỳ nút nào. Như thuộc tính 
ParentNode giúp bạn di chuyển đến nút cha của 1 nút nào đó, hoặc thuộc tính NextSibling giúp 
bạn di chuyển đến nút kế tiếp ở cùng cấp của nút hiện hành. 
Ví dụ: hiển thị cấu trúc của tập tin XML lên treeview lúc chương trình được Load lên. 
private void Form1_Load(object sender, System.EventArgs e)  {   
string path = Application.StartupPath + "\\employees.xml";   
XmlDocument document = new XmlDocument();    document.Load(path);   
TreeNode rootnode = TreeView1.Nodes.Add(document.DocumentElement.Name);   
XmlNodeList nodes = document.DocumentElement.ChildNodes;   
foreach (XmlNode childnode in nodes)    {     
TreeNode empNode = new TreeNode(childnode.Name + ":" +     
childnode.Attributes("employeeid").Name + "=" +     
childnode.Attributes("employeeid").Value);     
foreach (XmlNode node in childnode.ChildNodes)      {        if (node.Name == "firstname")        {         
empNode.Nodes.Add("First Name:" + node.InnerText);        }        if (node.Name == "lastname")        {         
empNode.Nodes.Add("Last Name:" + node.InnerText);        }        if (node.Name == "homephone")        {         
empNode.Nodes.Add("Home Phone:" + node.InnerText);        }        if (node.Name == "notes")        {         
empNode.Nodes.Add("Notes:" + node.InnerText);        }      }      rootnode.Nodes.Add(empNode);    }  } 
Đoạn code tạo 1 thể hiện của lớp XmlDocument và nạp tập tin employees.xml được đặt 
trong cùng thư mục của file thực thi của chương trình. Nút gốc của tài liệu xml có thể được truy 
cập thông qua thuộc tính DocumentElement của đối tượng thể hiện của lớp XmlDocument. 
Thuộc tính Name của DocumentElement trả về tên của nút gốc này (employees).  
