Tải bản đầy đủ (.pdf) (8 trang)

Tài liệu File , Thư mục và IO phần 2 pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (170.02 KB, 8 trang )

1.1 Truy xuất thông tin phiên bản của file
V
V


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);
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
V
V


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:

• 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);

// 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);
}
}
}

Hình 9.1 Một cây thư mục với TreeView
1.3 Đọc và ghi file văn bản
V

V


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,
The image part with relationsh ip ID rI d5 was not fo und in the file.
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.
// 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
V
V


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
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();
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();
}
}

×