1. Trang chủ >
  2. Công Nghệ Thông Tin >
  3. Kỹ thuật lập trình >

Chương 9:FILE, THƯ MỤC, VÀ I/O

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 (7.15 MB, 706 trang )


347



348

Chương 9: File, thư mục, và I/O



C



ác lớp I/O của Microsoft .NET gồm hai loại chính. Loại thứ nhất truy xuất thông tin

từ hệ thống file và cho phép thực hiện các thao tác trên hệ thống file (như chép file,

chuyển thư mục). Hai lớp tiêu biểu là FileInfo và DirectoryInfo. Loại thứ hai quan

trọng hơn, gồm rất nhiều lớp cho phép đọc và ghi dữ liệu từ mọi kiểu stream. Stream có thể

tương ứng với một file nhị phân hay văn bản, một file trong không gian lưu trữ riêng, một kết

nối mạng, hoặc một vùng đệm bộ nhớ. Trong mọi trường hợp, cách thức tương tác với stream

đều như nhau. Trong chương này, chúng ta sẽ xem xét các lớp hệ thống file và các lớp dựatrên-stream.

Các mục trong chương này trình bày các vấn đề sau:



 Truy xuất và sửa đổi các thông tin của một file hay một thư mục (các mục 9.1, 9.2, 9.4,

9.5, và 9.16).



 Chép, di chuyển, xóa file hay thư mục (mục 9.3).

 Hiển thị động một cây thư mục trong một ứng dụng dựa-trên-Windows (mục 9.6) và sử

dụng các hộp thoại file (mục 9.17).



 Đọc và ghi file văn bản (mục 9.7) và file nhị phân (mục 9.8), cũng như tạo file tạm

(mục 9.15) và file trong một không gian lưu trữ riêng của người dùng (mục 9.18).















Đọc file một cách bất đồng bộ (mục 9.9).

Tìm file (mục 9.10) và kiểm tra hai file có trùng nhau hay không (mục 9.11).

Làm việc với các chuỗi có chứa thông tin đường dẫn (mục 9.12 đến 9.14).

Theo dõi sự thay đổi của hệ thống file (mục 9.19).

Ghi ra cổng COM (mục 9.20).



Truy xuất các thông tin về file hay thư mục



1.





Bạn cần truy xuất các thông tin về một file hay một thư mục, chẳng hạn ngày tạo

hay các thuộc tính của chúng.







Tạo



đối



tượng



System.IO.FileInfo



cho



file



hay



đối



tượng



System.IO.DirectoryInfo cho thư mục. Sau đó, truyền đường dẫn tới file hay thư



mục đó trong phương thức khởi dựng. Các thông tin cần thiết sẽ được truy xuất

thông qua các thuộc tính của đối tượng.

Để tạo một đối tượng FileInfo hay DirectoryInfo, bạn cần truyền đường dẫn tương đối hay

đầy đủ trong phương thức khởi dựng của nó. Bạn có thể lấy các thông tin về file hay thư mục

thông qua các thuộc tính của đối tượng tương ứng. Bảng 9.1 liệt kê các thành viên của lớp

FileInfo và DirectoryInfo:

Bảng 9.1 Các thành viên của FileInfo và DirectoryInfo

Thành viên



Thuộc lớp



Mô tả



349

Chương 9: File, thư mục, và I/O



Exists



FileInfo và

DirectoryInfo



Trả về true hay false, tùy thuộc vào file hay

thư mục có tồn tại ở đường dẫn được chỉ định

hay không.



Attributes



FileInfo và

DirectoryInfo



Trả về một hoặc nhiều giá trị thuộc kiểu liệt

kê System.IO.FileAttributes, cho biết các

thuộc tính của file hay thư mục.



FileInfo và

DirectoryInfo



Trả về các thể hiện System.DateTime cho biết

khi nào một file hay thư mục được tạo ra, truy

xuất lần cuối, và cập nhật lần cuối.



FileInfo và

DirectoryInfo



Trả về một chuỗi chứa tên đầy đủ, tên thư mục

hay tên file (cùng phần mở rộng), và phần mở

rộng.



CreationTime,

LastAccessTime, và

LastWriteTime

FullName, Name, và

Extension

Length



FileInfo



Trả về kích thước file (tính theo byte).

DirectoryName trả về chuỗi chứa tên của thư



mục cha; Directory trả về đối tượng

DirectoryInfo mô tả thư mục cha, cho phép

bạn truy xuất thêm thông tin về nó.



DirectoryName và

Directory



FileInfo



Parent và Root



DirectoryInfo



Trả về đối tượng DirectoryInfo mô tả thư

mục cha hay thư mục gốc.



CreateSubdirectory



DirectoryInfo



Tạo một thư mục bên trong thư mục được mô

tả bởi đối tượng DirectoryInfo, tên thư mục

cần tạo được truyền cho phương thức. Trả về

đối tượng DirectoryInfo mô tả thư mục con

vừa tạo.



GetDirectories



DirectoryInfo



Trả về mảng các đối tượng DirectoryInfo,

mỗi đối tượng mô tả một thư mục con trong

thư mục này.



GetFiles



DirectoryInfo



Trả về mảng các đối tượng FileInfo, mỗi đối

tượng mô tả một file trong thư mục này.



Chú ý hai điểm quan trọng khi sử dụng các đối tượng FileInfo và DirectoryInfo:





Tất cả các thuộc tính của đối tượng FileInfo và DirectoryInfo được đọc ngay lần đầu

tiên bạn truy xuất một thuộc tính nào đó. Nếu file hay thư mục thay đổi sau thời điểm

này, bạn phải gọi phương thức Refresh để cập nhật các thuộc tính.







Sẽ không có lỗi nếu bạn chỉ định một đường dẫn không tương ứng với một file hay thư

mục đang tồn tại khi tạo một đối tượng FileInfo hay DirectoryInfo. Thay vào đó, bạn

sẽ nhận được một đối tượng mô tả file hay thư mục không tồn tại—thuộc tính Exists

của nó có giá trị false. Bạn có thể sử dụng đối tượng này để tạo file hay thư mục bằng

cách gọi phương thức Create của nó. Nếu bạn truy xuất thuộc tính khác, ngoại lệ

FileNotFoundException hay DirectoryNotFoundException sẽ bị ném.



350

Chương 9: File, thư mục, và I/O



Ứng dụng Console dưới đây nhận một đường dẫn file từ dòng lệnh, và rồi hiển thị thông tin về

file và thư mục chứa file.



351

Chương 9: File, thư mục, và I/O

using System;

using System.IO;



public class FileInformation {



private static void Main(string[] args) {



if (args.Length == 0) {



Console.WriteLine("Please supply a file name:”);

return;

}



FileInfo file = new FileInfo(args[0]);



// Hiển thị thông tin file.

Console.WriteLine("Checking file: " + file.Name);

Console.WriteLine("File exists: " + file.Exists.ToString());



if (file.Exists) {



Console.Write("File created: ");

Console.WriteLine(file.CreationTime.ToString());

Console.Write("File last updated: ");

Console.WriteLine(file.LastWriteTime.ToString());

Console.Write("File last accessed: ");

Console.WriteLine(file.LastAccessTime.ToString());

Console.Write("File size (bytes): ");

Console.WriteLine(file.Length.ToString());

Console.Write("File attribute list: ");

Console.WriteLine(file.Attributes.ToString());



}

Console.WriteLine();



// Hiển thị thông tin thư mục.

DirectoryInfo dir = file.Directory;



352

Chương 9: File, thư mục, và I/O



Console.WriteLine("Checking directory: " + dir.Name);

Console.WriteLine("In directory: " + dir.Parent.Name);

Console.Write("Directory exists: ");

Console.WriteLine(dir.Exists.ToString());



if (dir.Exists) {

Console.Write("Directory created: ");

Console.WriteLine(dir.CreationTime.ToString());

Console.Write("Directory last updated: ");

Console.WriteLine(dir.LastWriteTime.ToString());

Console.Write("Directory last accessed: ");

Console.WriteLine(dir.LastAccessTime.ToString());

Console.Write("Directory attribute list: ");

Console.WriteLine(dir.Attributes.ToString());

Console.WriteLine("Directory contains: " +

dir.GetFiles().Length.ToString() + " files");

}



Console.ReadLine();

}

}



Nếu bạn thực thi lệnh FileInformation c:\windows\win.ini, kết xuất có thể như sau:

Checking file: win.ini

File exists: True

File created: 2001-08-23 8:00:00 AM

File last updated: 2003-03-22 9:55:16 AM

File last accessed: 2003-05-26 2:21:53 PM

File size (bytes): 2128

File attribute list: Archive



Checking directory: windows

In directory: c:\

Directory exists: True

Directory created: 2000-01-01 8:03:33 AM



353

Chương 9: File, thư mục, và I/O

Directory last updated: 2003-05-26 2:25:25 PM

Directory last accessed: 2003-05-26 2:25:25 PM

Directory attribute list: Directory

Directory contains: 147 files







Bạn có thể sử dụng các phương thức tĩnh của lớp File và Directory thay cho các

phương thức của lớp FileInfo và DirectoryInfo, nhưng bạn phải truyền tên file

hay đường dẫn mỗi lần gọi. Trong trường hợp thực hiện nhiều thao tác với cùng

một file hay thư mục thì sử dụng các lớp FileInfo và DirectoryInfo nhanh hơn,

vì chúng thực hiện kiểm tra bảo mật chỉ một lần.



Thiết lập các thuộc tính của file và thư mục



2.







Bạn cần kiểm tra hay thay đổi các thuộc tính của file hay thư mục.

Tạo



đối



tượng



System.IO.FileInfo



cho



file



hay



tạo



đối



tượng



System.IO.DirectoryInfo cho thư mục. Sau đó, sử dụng các toán tử AND (&) và



OR (|) để thay đổi giá trị của thuộc tính Attributes.

Các thuộc tính FileInfo.Attributes và DirectoryInfo.Attributes mô tả các thuộc tính của

file như archive, system, hidden, read-only, compressed, và encrypted (tham khảo thêm trong

tài liệu MSDN). Vì một file có thể có nhiều thuộc tính nên Attributes là một tập các giá trị

kiểu liệt kê. Để kiểm tra hay thay đổi một thuộc tính đơn lẻ, bạn cần sử dụng các phép toán

trên bit.

Ví dụ sau nhận vào một file và kiểm tra thuộc tính read-only:

using System;

using System.IO;

public class Attributes {

private static void Main() {

// Giả sử file này có thuộc tính archive và read-only.

FileInfo file = new FileInfo("data.txt");

// Lệnh này sẽ hiển thị chuỗi "ReadOnly, Archive".

Console.WriteLine(file.Attributes.ToString());

// Điều kiện dưới đây sai, vì còn có thuộc tính khác

// đã được thiết lập.

if (file.Attributes == FileAttributes.ReadOnly) {

Console.WriteLine("File is read-only (faulty test).");



354

Chương 9: File, thư mục, và I/O



}

// Điều kiện dưới đây đúng, vì nó chỉ lọc ra

// thuộc tính read-only.

if ((file.Attributes & FileAttributes.ReadOnly) ==

FileAttributes.ReadOnly) {

Console.WriteLine("File is read-only (correct test).");

}

Console.ReadLine();

}

}







Để hiểu được ví dụ trên, bạn cần biết rằng Attributes được tạo thành (ở dạng

nhị phân) bởi một dãy các chữ số 0 và 1, chẳng hạn 00010011. Mỗi chữ số 1 cho

biết một thuộc tính được thiết lập, mỗi chữ số 0 cho biết một thuộc tính không

được thiết lập. Khi bạn sử dụng phép AND, nó sẽ so sánh mỗi chữ số này với mỗi

chữ số tương ứng trong giá trị liệt kê. Ví dụ, nếu bạn AND giá trị 00100001 (mô

tả thuộc tính archive và read-only) với giá trị liệt kê 00000001 (mô tả thuộc tính

read-only), kết quả sẽ là 00000001 (chỉ có được chữ số 1 khi ở cả hai vị trí tương

ứng đều là 1).



Khi thiết lập một thuộc tính, bạn cũng phải sử dụng phép toán trên bit. Trong trường hợp này,

bạn cần cẩn thận để không vô ý xóa các thuộc tính khác.

// Chỉ thêm thuộc tính read-ony.

file.Attributes = file.Attributes | FileAttributes.ReadOnly;

// Chỉ xóa thuộc tính read-only.

file.Attributes = file.Attributes & ~FileAttributes.ReadOnly;



Chép, chuyển, xóa file hay thư mục



3.







Bạn cần chép, chuyển, xóa một file hay thư mục

Tạo



đối



tượng



System.IO.FileInfo



cho



file



hay



đối



tượng



System.IO.DirectoryInfo cho thư mục, truyền đường dẫn cho phương thức khởi



dựng. Sử dụng các phương thức của đối tượng để chép, chuyển, xóa.

Các lớp FileInfo và DirectoryInfo cung cấp nhiều phương thức dùng để thao tác trên file và

thư mục. Bảng 9.2 và 9.3 trình bày các phương thức của lớp FileInfo và DirectoryInfo.

[



Bảng 9.2 Các phương thức dùng để thao tác đối tượng FileInfo

Phương thức



Mô tả



355

Chương 9: File, thư mục, và I/O



CopyTo



Chép một file sang đường dẫn mới, tên file được chỉ định

trong đối số. Nó cũng trả về một đối tượng FileInfo mô tả file

mới được chép. Bạn có thể truyền thêm một thông số tùy chọn

có giá trị true để cho phép chép đè.

Create tạo file được chỉ định và trả về một đối tượng



Create và CreateText



Open, OpenRead, OpenText,



và OpenWrite



FileStream dùng để ghi ra file. CreateText cũng thực hiện như



thế, nhưng trả về đối tượng StreamWriter gói lấy stream. Xem

mục 9.7 và 9.8 để có thêm thông tin về việc ghi file.

Mở một file (nếu nó tồn tại). OpenRead và OpenText mở file

trong chế độ chỉ-đọc, trả về một đối tượng FileStream hay

StreamReader. OpenWrite mở file trong chế độ chỉ-ghi, trả về

một đối tượng FileStream. Xem thêm mục 9.7 và 9.8 để có

thêm thông tin về việc đọc file.



Delete



Xóa file (nếu nó tồn tại).



MoveTo



Chuyển một file đến đường dẫn mới, tên file được chỉ định

trong đối số. MoveTo cũng được sử dụng để đổi tên một file mà

không chuyển chỗ.



Bảng 9.3 Các phương thức dùng để thao tác đối tượng DirectoryInfo

Phương thức



Mô tả



Create



Tạo thư mục được chỉ định. Nếu đường dẫn chỉ định nhiều thư

mục chưa tồn tại, tất cả sẽ được tạo một lượt.



CreateSubdirectory



Tạo một thư mục với tên cụ thể bên trong thư mục được mô tả

bởi đối tượng DirectoryInfo. Nó cũng trả về một đối tượng

DirectoryInfo mô tả thư mục con.



Delete



Xóa một thư mục (nếu nó tồn tại). Nếu muốn xóa một thư mục

có chứa các thư mục khác, bạn phải sử dụng phương thức nạp

chồng Delete chấp nhận một thông số có tên là recursive và

thiết lập nó là true.



MoveTo



Chuyển một thư mục đến đường dẫn mới. MoveTo có thể được

sử dụng để đổi tên một thư mục mà không chuyển chỗ.



Lớp DirectoryInfo không có phương thức nào dùng để sao chép thư mục. Tuy nhiên, bạn có

thể dễ dàng viết được một phương thức như thế dựa trên kỹ thuật đệ quy và phương thức

CopyTo của đối tượng FileInfo:

using System;

using System.IO;



public class FileSystemUtil {



356

Chương 9: File, thư mục, và I/O



public static void CopyDirectory(DirectoryInfo source,

DirectoryInfo destination) {



if (!destination.Exists) {

destination.Create();

}



// Chép tất cả file.

FileInfo[] files = source.GetFiles();

foreach (FileInfo file in files) {



file.CopyTo(Path.Combine(destination.FullName, file.Name));

}



// Xử lý các thư mục con.

DirectoryInfo[] dirs = sourceDir.GetDirectories();

foreach (DirectoryInfo dir in dirs) {



// Lấy thư mục đích.

string destinationDir = Path.Combine(destination.FullName,

dir.Name);



// Gọi đệ quy CopyDirectory().

CopyDirectory(dir, new DirectoryInfo(destinationDir));

}

}

}



Ví dụ sau sử dụng phương thức vừa viết ở trên để chép thư mục, đường dẫn các thư mục được

truyền qua dòng lệnh:

public class CopyDir {



private static void Main(string[] args) {



if (args.Length != 2) {



357

Chương 9: File, thư mục, và I/O

Console.WriteLine("usage:



" +



"CopyDir [sourcePath] [destinationPath]");

return;

}

DirectoryInfo sourceDir = new DirectoryInfo(args[0]);

DirectoryInfo destinationDir = new DirectoryInfo(args[1]);



FileSystemUtil.CopyDirectory(new DirectoryInfo(sourceDir),

new DirectoryInfo(destinationDir));

Console.WriteLine("Copy complete.");

Console.ReadLine();

}

}



Tính kích thước của thư mục



4.





Bạn cần tính kích thước của tất cả file nằm trong một thư mục (hoặc cả trong

các thư mục con của nó).







Duyệt qua tất cả file trong thư mục, tính tổng các thuộc tính FileInfo.Length của

chúng. Sử dụng kỹ thuật đệ quy để tính cho cả các file nằm trong các thư mục

con.



Lớp DirectoryInfo không có thuộc tính nào trả về thông tin kích thước. Tuy nhiên, bạn có thể

dễ dàng tính được kích thước của tất cả các file nằm trong một thư mục bằng thuộc tính

FileInfo.Length.

Phương thức dưới đây sử dụng kỹ thuật trên và có thể tùy chọn duyệt đệ quy qua các thư mục

con:

using System;

using System.IO;

public class FileSystemUtil {



public static long CalculateDirectorySize(DirectoryInfo directory,

bool includeSubdirectories) {



long totalSize = 0;



// Duyệt tất cả các file trong thư mục.



Xem Thêm
Tải bản đầy đủ (.pdf) (706 trang)

×