File , Thư mục và IO phần 2

Chia sẻ: Nghia Bui Tuan | Ngày: | Loại File: PDF | Số trang:8

0
55
lượt xem
16
download

File , Thư mục và IO phần 2

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bạn cần truy xuất các thông tin về phiên bản của file như publisher, revision number, comment… Sử dụng phương thức tĩnh GetVersionInfo của lớp System.Diagnostics. FileVersionInfo. .NET Framework cho phép bạn truy xuất các thông tin về file mà không cần dựa vào Windows API.

Chủ đề:
Lưu

Nội dung Text: File , Thư mục và IO phần 2

  1. 1.1 Truy xuất thông tin phiên bản của file Bạn cần truy xuất các thông tin về phiên bản của file như publisher, revision number, comment… Sử dụng phương thức tĩnh GetVersionInfo của lớp System.Diagnostics. FileVersionInfo. .NET Framework cho phép bạn truy xuất các thông tin về file mà không cần dựa vào Windows API. Bạn chỉ cần sử dụng lớp FileVersionInfo và gọi phương thức GetVersionInfo với đối số là tên file. Kế đó, bạn có thể truy xuất thông tin thông qua các thuộc tính của FileVersionInfo. using System; using System.Diagnostics; public class VersionInfo { private static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Please supply a file name."); return; } FileVersionInfo info = FileVersionInfo.GetVersionInfo(args[0]); // Hiển thị các thông tin về phiên bản. Console.WriteLine("Checking File: " + info.FileName); Console.WriteLine("Product Name: " + info.ProductName); Console.WriteLine("Product Version: " + info.ProductVersion); Console.WriteLine("Company Name: " + info.CompanyName); Console.WriteLine("File Version: " + info.FileVersion); Console.WriteLine("File Description: " + info.FileDescription); Console.WriteLine("Original Filename: " + info.OriginalFilename); Console.WriteLine("Legal Copyright: " + info.LegalCopyright); Console.WriteLine("InternalName: " + info.InternalName); Console.WriteLine("IsDebug: " + info.IsDebug); Console.WriteLine("IsPatched: " + info.IsPatched); Console.WriteLine("IsPreRelease: " + info.IsPreRelease);
  2. Console.WriteLine("IsPrivateBuild: " + info.IsPrivateBuild); Console.WriteLine("IsSpecialBuild: " + info.IsSpecialBuild); Console.ReadLine(); } } Dưới đây là kết xuất khi bạn chạy lệnh VersionInfo c:\windows\explorer.exe: Checking File: c:\windows\explorer.exe Product Name: Microsoft® Windows® Operating System Product Version: 6.00.2600.0000 Company Name: Microsoft Corporation File Version: 6.00.2600.0000 (xpclient.010817-1148) File Description: Windows Explorer Original Filename: EXPLORER.EXE Legal Copyright: © Microsoft Corporation. All rights reserved. InternalName: explorer IsDebug: False IsPatched: False IsPreRelease: False IsPrivateBuild: False IsSpecialBuild: False® 1.2 Sử dụng TreeView để hiển thị cây thư mục just-in-time Bạn cần hiển thị một cây thư mục trong TreeView. Tuy nhiên, việc lấp đầy cấu trúc cây thư mục khi khởi động tốn quá nhiều thời gian. Thêm cấp thư mục đầu tiên vào TreeView, và thêm một nút giả (ẩn) vào mỗi nhánh. Phản ứng lại sự kiện TreeView.BeforeExpand để thêm các thư mục con vào một nhánh trước khi nó được hiển thị. Bạn có thể sử dụng kỹ thuật đệ quy để xây dựng toàn bộ cây thư mục. Tuy nhiên, việc quét hệ thống file theo cách này có thể chậm, đặc biệt đối với các ổ đĩa lớn. Vì lý do này, các phần mềm quản lý file chuyên nghiệp (bao gồm Windows Explorer) sử dụng một kỹ thuật khác: chỉ hiển thị những thông tin nào người dùng cần đến. TreeView rất thích hợp với cách tiếp cận này vì nó cung cấp sự kiện BeforeExpand (sự kiện này phát sinh trước khi một cấp mới được hiển thị). Bạn có thể sử dụng một placeholder (như dấu hoa thị hay nút rỗng) trong tất cả các nhánh chưa được thêm vào. Điều này cho phép bạn thêm vào các phần của cây thư mục khi chúng được hiển thị. Để sử dụng kiểu giải pháp này, bạn cần ba yếu tố sau:
  3. • Phương thức Fill—thêm một cấp mới vào một thư mục. Bạn sẽ sử dụng phương thức này để thêm vào các cấp khi chúng được mở rộng. • Phương thức thụ lý sự kiện Form.Load—sử dụng Fill để tạo cây với cấp đầu tiên. • Phương thức thụ lý sự kiện TreeView.BeforeExpand—phản ứng khi người dùng mở rộng một nút và gọi Fill nếu thông tin của thư mục này chưa được thêm. Dưới đây là phần mã cho form: using System; using System.IO; using System.Drawing; using System.Windows.Forms; public class DirectoryTree : System.Windows.Forms.Form { private System.Windows.Forms.TreeView treeDirectory; // (Bỏ qua phần mã designer.) private void Fill(TreeNode dirNode) { DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath); // Một ngoại lệ có thể bị ném nếu bạn không có // đủ quyền thao tác trên file hay thư mục. // Bạn có thể bắt và bỏ qua ngoại lệ này. foreach (DirectoryInfo dirItem in dir.GetDirectories()) { // Thêm nút giả cho thư mục. TreeNode newNode = new TreeNode(dirItem.Name); dirNode.Nodes.Add(newNode); newNode.Nodes.Add("*"); } } private void DirectoryTree_Load(object sender, System.EventArgs e) { // Thiết lập nút đầu tiên. TreeNode rootNode = new TreeNode("C:\\"); treeDirectory.Nodes.Add(rootNode);
  4. // Thêm cấp thứ nhất và mở rộng nó. Fill(rootNode); treeDirectory.Nodes[0].Expand(); } private void treeDirectory_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) { // Nếu tìm thấy một nút giả, xóa nó và đọc các thư mục thật. if (e.Node.Nodes[0].Text == "*") { e.Node.Nodes.Clear(); Fill(e.Node); } } } The image part with relationship ID rId5 was not found in the file. Hình 9.1 Một cây thư mục với TreeView 1.3 Đọc và ghi file văn bản Bạn cần ghi dữ liệu vào một file văn bản theo kiểu mã hóa ASCII, Unicode, hay UTF-8. Tạo một đối tượng System.IO.FileStream tham chiếu đến file. Để ghi file, hãy gói FileStream trong một System.IO.StreamWriter và sử dụng phương thức nạp chồng Write. Để đọc file, hãy gói FileStream trong một System.IO.StreamReader và sử dụng phương thức Read hay ReadLine. .NET cho phép bạn ghi hay đọc văn bản bằng lớp StreamWriter và StreamReader. Khi ghi dữ liệu với StreamWriter, hãy sử dụng phương thức StreamWriter.Write. Phương thức này được nạp chồng để hỗ trợ tất cả các kiểu dữ liệu thông thường trong C# .NET,
  5. bao gồm chuỗi, ký tự, số nguyên, số thực dấu chấm động, số thập phân,... Tuy nhiên, phương thức Write luôn chuyển dữ liệu thành văn bản. Nếu muốn chuyển văn bản này trở về kiểu ban đầu thì bạn nên sử dụng WriteLine để bảo đảm mỗi giá trị được đặt trên một dòng riêng. Có nhiều cách mô tả một chuỗi dưới dạng nhị phân, tùy thuộc vào cách mã hóa. Các kiểu mã hóa thông thường là: • ASCII—sử dụng 7 bit để mã hóa mỗi ký tự trong chuỗi. Dữ liệu được mã hóa theo ASCII không thể chứa các ký tự Unicode mở rộng. Khi sử dụng kiểu mã hóa ASCII trong .NET, các bit được đệm thêm để mảng byte kết quả sẽ có 1 byte cho mỗi ký tự. • Full Unicode, hay UTF-16—sử dụng 16 bit để mã hóa mỗi ký tự trong chuỗi, nên mảng byte kết quả sẽ có 2 byte cho mỗi ký tự. • UTF-7 Unicode—sử dụng 7 bit cho các ký tự ASCII bình thường và nhiều cặp 7 bit cho các ký tự mở rộng. Kiểu mã hóa này chủ yếu dùng cho các giao thức 7 bit, chẳng hạn mail. • UTF-8 Unicode—sử dụng 8 bit cho các ký tự ASCII bình thường và nhiều cặp 8 bit cho các ký tự mở rộng. Mảng byte kết quả sẽ có 1 byte cho mỗi ký tự (giả sử không có ký tự mở rộng). .NET cung cấp một lớp cho mỗi kiểu mã hóa trong không gian tên System.Text. Khi sử dụng StreamReader và StreamWriter, bạn có thể chỉ định kiểu mã hóa hoặc sử dụng kiểu mặc định là UTF-8. Khi đọc thông tin, sử dụng phương thức Read hay ReadLine của lớp StreamReader. Phương thức Read đọc một ký tự, hay số ký tự do bạn chỉ định, và trả về một ký tự hay mảng ký tự. Phương thức ReadLine trả về một chuỗi chứa toàn bộ nội dung một hàng. Ứng dụng Console dưới đây minh họa việc ghi và đọc một file văn bản: using System; using System.IO; using System.Text; public class TextFileTest { private static void Main() { // Tạo file mới. FileStream fs = new FileStream("test.txt", FileMode.Create); // Tạo một writer và chỉ định kiểu mã hóa.
  6. // Kiểu mặc định (UTF-8) hỗ trợ ký tự Unicode, // nhưng mã hóa các ký tự chuẩn giống như ASCII StreamWriter w = new StreamWriter(fs, Encoding.UTF8); // Ghi một số thập phân, một chuỗi, và một ký tự. w.WriteLine(124.23M); w.WriteLine("Test string"); w.WriteLine('!'); // Bảo đảm tất cả dữ liệu được ghi từ buffer. w.Flush(); // Đóng file. w.Close(); fs.Close(); Console.WriteLine("Press Enter to read the information."); Console.ReadLine(); // Mở file trong chế độ chỉ-đọc. fs = new FileStream("test.txt", FileMode.Open); StreamReader r = new StreamReader(fs, Encoding.UTF8); // Đọc dữ liệu và chuyển nó về kiểu thích hợp. Console.WriteLine(Decimal.Parse(r.ReadLine())); Console.WriteLine(r.ReadLine()); Console.WriteLine(Char.Parse(r.ReadLine())); r.Close(); fs.Close(); Console.ReadLine(); } } 1.4 Đọc và ghi file nhị phân Bạn cần ghi dữ liệu vào file nhị phân với kiểu dữ liệu mạnh. Tạo một đối tượng System.IO.FileStream tham chiếu đến file. Để ghi file, hãy gói FileStream trong một System.IO.BinaryWriter và sử dụng phương thức
  7. nạp chồng Write. Để đọc file, hãy gói FileStream trong một System.IO.BinaryReader và sử dụng phương thức Read phù hợp với kiểu dữ liệu. .NET cho phép bạn ghi hay đọc dữ liệu nhị phân bằng lớp BinaryWriter và BinaryReader. Khi ghi dữ liệu với BinaryWriter, hãy sử dụng phương thức BinaryWriter.Write. Phương thức này được nạp chồng để hỗ trợ tất cả kiểu dữ liệu thông thường trong C# .NET, bao gồm chuỗi, ký tự, số nguyên, số thực dấu chấm động, số thập phân,... Thông tin sau đó được mã hóa thành một dãy các byte và ghi vào file. Bạn có thể chỉ định kiểu mã hóa cho chuỗi bằng một phương thức khởi dựng nạp chồng nhận một đối tượng System.Text.Encoding làm đối số (đã được mô tả trong mục 9.7). Sử dụng file nhị phân để thao tác với các kiểu dữ liệu thì khá phức tạp, vì khi truy xuất thông tin, bạn phải sử dụng một trong những phương thức Read kiểu mạnh của BinaryReader. Ví dụ: muốn truy xuất dữ liệu dạng thập phân thì phải sử dụng ReadDecimal; còn muốn đọc một chuỗi thì phải sử dụng ReadString (BinaryWriter luôn ghi lại chiều dài của chuỗi khi ghi chuỗi vào file để tránh lỗi). Ứng dụng Console dưới đây minh họa việc ghi và đọc một file nhị phân: using System; using System.IO; public class BinaryFileTest { private static void Main() { // Tạo file và tạo writer. FileStream fs = new FileStream("test.txt", FileMode.Create); BinaryWriter w = new BinaryWriter(fs); // Ghi một số thập phân, hai chuỗi, và một ký tự. w.Write(124.23M); w.Write("Test string"); w.Write("Test string 2"); w.Write('!'); // Bảo đảm tất cả dữ liệu được ghi từ buffer. w.Flush(); // Đóng file. w.Close();
  8. fs.Close(); Console.WriteLine("Press Enter to read the information."); Console.ReadLine(); // Mở file trong chế độ chỉ-đọc. fs = new FileStream("test.txt", FileMode.Open); // Hiển thị dữ liệu thô trong file. StreamReader sr = new StreamReader(fs); Console.WriteLine(sr.ReadToEnd()); Console.WriteLine(); // Đọc dữ liệu và chuyển nó về kiểu thích hợp. fs.Position = 0; BinaryReader br = new BinaryReader(fs); Console.WriteLine(br.ReadDecimal()); Console.WriteLine(br.ReadString()); Console.WriteLine(br.ReadString()); Console.WriteLine(br.ReadChar()); fs.Close(); Console.ReadLine(); } }
Đồng bộ tài khoản