Bài 7: Xử lý nhập/xuất dữ liệu - Nền tảng lập trình C#


Khi bạn tạo ra các ứng dụng desktop, khả năng lưu thông tin giữa người sử dụng phiên là phổ biến.Bài viết khám phá các loại lõi được định nghĩa và học hỏi làm thế nào để thay đổi thư mục và tập tin cấu trúc của một máy lập trình.


  • Khái niệm về các loại tập tin
  • Xử lý hệ thống tập tin và thư mục qua các lớp
  • Xử lý đọc ghi tập tin

Khái niệm về các loại tập tin

  • Đối với các kiểu dữ liệu như kiểu số, kiểu mảng, kiểu cấu trúc… thì dữ liệu được tổ chức trong bộ nhớ trong (RAM) của máy tính nên khi kết thúc việc thực hiện chương trình thì dữ liệu cũng bị mất
  • Để giải quyết vấn đề, người ta đưa ra kiểu tập tin (file) cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (đĩa). Khi kết thúc chương trình thì dữ liệu vẫn còn do đó chúng ta có thể sử dụng nhiều lần

Có 3 loại dữ liệu kiểu tập tin:

  • Tập tin văn bản (Text File)
    • Là loại tập tin dùng để ghi các ký tự lên đĩa, các ký tự này được lưu trữ dưới dạng mã Ascii.
    • Điểm đặc biệt là dữ liệu của tập tin được lưu trữ thành các dòng, mỗi dòng được kết thúc bằng ký tự xuống dòng (new line), ký hiệu ‘\n’; ký tự này là sự kết hợp của 2 ký tự CR (Carriage Return - Về đầu dòng, mã Ascii là 13) và LF (Line Feed - Xuống dòng, mã Ascii là 10)
    • Mỗi tập tin được kết thúc bởi ký tự EOF (End Of File) có mã Ascii là 26
    • Tập tin văn bản chỉ có thể truy xuất theo kiểu tuần tự
  • Tập tin định kiểu (Typed File)
    • Là loại tập tin bao gồm nhiều phần tử có cùng kiểu: char int long c , int, long, cấu trúc và … và được lưu trữ trên đĩa dưới dạng một chuỗi các byte liên tục
  • Tập tin không định kiểu (Untyped File)
    • Là loại tập tin mà dữ liệu của chúng bao gồm các cấu trúc dữ liệu nhưng g người dùng g q không quan tâm đến nội dung hoặc kiểu của nó mà chỉ lưu ý đến các yếu tố vật lý của tập tin như độ lớn và các yếu tố tác động lên tập tin mà thôi

Con trỏ tập tin:

  • Khi một tập tin được mở ra để làm việc, tại mỗi thời điểm, sẽ có một vị trí của tập tin mà tại đó việc đọc/ghi thông tin sẽ xảy ra. Người ta hình dung có một con trỏ đang chỉ đến vị trí đó và đặt tên nó là con trỏ tập tin.
  • Sau khi đọc/ghi xong dữ liệu con trỏ sẽ chuyển dịch thêm một phần tử về phía cuối tập tin. Sau phần tử dữ liệu cuối cùng của tập tin là dấu kết thúc tập tin EOF (End Of File).

Biến tập tin: Là một biến thuộc kiểu dữ liệu tập tin dùng để đại diện cho một tập tin. Dữ liệu chứa trong một tập tin được truy xuất qua các thao tác với thông số là biến tập tin đại diện cho tập tin đó.

Xử lý hệ thống tập tin và thư mục

  • FileSystemInfo
  • FileInfo
  • DirectoryInfo
  • DriveInfo
  • Path
  • FileSystemWatcher

Các lớp hệ thống tập tin

  • Bên trong namespace có tên System.IO là một tập hợp các class được sử dụng để định vị và thao tác các tập tin, thư mục và thiết bị. Các class hệ thống tập tin được chia thành 2 loại class: informational và utility.
  • Hầu hết các class loại informational dẫn xuất từ class cơ sở FileSystemInfo. Các class này trưng tất cả thông tin hệ thống liên quân các đối tượng hệ thống tập tin Đó là các class có tên FileInfo và DirectoryInfo
  • Ngoài ra, class DriveInfo trình bày thiết bị trong hệ thống tập tin, mặc dù nó vẫn là một class thuộc loại informational, tuy nhiên nó không dẫn xuất từ FileSystemInfo bởi lẽ nó không chia sẻ các kiểu hành vi chung (ví dụ, bạn có thể xóa các tập tin và thư mục, nhưng không thể xóa các thiết bị).
  • Các class loại utility cung cấp các phương thức static (hoặc phương thức shared trong Visual Basic) để thực thi một số hoạt động trên các đối tượng hệ thống tập tin như các tập tin, thư mục và hệ thống tập tin đường dẫn (paths). Các loại utility bao gồm các class: File, Directory và Path

FileSystemInfo Class

  • FileSystemInfo cung cấp các chức năng cơ bản cho tất cả các lớp xử lý hệ thống tập tin và thư mục
  • Bảng các thuộc tính chính của FileSystemInfo
    • Attributes Gán hoặc lấy giá trị các thuộc tính của tập tin hay thư mục hiện hành.
    • CreationTime Gán hoặc lấy giá trị về thời gian tạo lập của tập tin hay thư mục.
    • Exists Kiểm tra tập tin hay thư mục có tồn tại hay không.
    • Extension Lấy thông tin phần mở rộng (kiểu) của tập tin
    • LastAccessTime Gán hoặc lấy giá trị về thời gian truy cập cuối cùng của tập tin hay thư mục.
    • LastWriteTime Gets or sets the time the file or directory was last written to.
    • Name Trả về tên của tập tin hay thư mục
    • FullName Lấy đường dẫn đầy đủ của tập tin hay thư mục
    • Delete Xóa tập tin hay thư mục trong hệ thống tập tin.
    • Refresh Cập nhật lại dữ liệu trong class với thông tin mới nhất từ hệ thống tập tin

FileInfo Class

  • FileInfo cung cấp các chức năng cơ bản để truy xuất và thao tác với một tập tin trong hệ thống tập tin.
  • Bảng các thuộc tính chính của FiIfeInfo
    • Directory Trả về thư mục chứa tập tin hiện hành đang truy xuất
    • DirectoryName Trả về tên của thư mục chứa tập tin đang truy xuất
    • IsReadOnly Lấy và thiết lập thông tin chỉ đọc cho tập tin
    • Length Kích thước của tập tin
    • AppendText Tạo một đối tượng StreamWriter cho phép ghi thêm văn bản vào trong tập tin
    • CopyTo Sao chép tập tin đến thư mục khác
    • Create Tạo một tập tin mới dựa trên các thông tin của tập tin hiện hành
    • CreateText Tạo một đối tượng StreamWriter cho phép ghi văn bản vào trong tập tin
    • Decrypt Giải mã tập tin đã được mã hóa .
    • Encrypt Mã hóa nội dung tập tin.
    • MoveTo Di chuyển tập tin đến thư mục khác
    • Open Mở tập tin để đọc hoặc ghi nội dung
    • OpenRead Mở tập tin ở chế độ chỉ đọc.
    • OpenText Mở tập tin và trả về một StreamReader cho phép đọc nội dung bên trong tập tin.
    • OpenWrite Mở tập tin ở chế độ chỉ ghi
    • Replace Thay thế nội dung của tập tin bằng thông tin trong FileInfo

Ví dụ:
Ví dụ kiểm tra tập tin có tồn tại hay không

DirectoryInfo Class 

  • DirectoryInfo cung cấp các chức năng cơ bản để truy xuất và thao tác với một thư mục trong hệ thống tập tin.
  • Bảng các thuộc tính chính của DirectoryInfo
    • Parent Trả về thư mục chứa (thư mục cha) của thư mục hiện hành đang truy xuất
    • Root Trả về thư mục gốc trong chuỗi đường dẫn của thư mục hiện hành
    • Create Tạo thư mục theo thông tin được mô tả trong DirectoryInfo.
    • CreateSubdirectory Tạo thư mục con của thư mục hiện hành
    • GetDirectories Trả về một mảng đối tượng kiểu DirectoryInfo gồm các thư mục con trong thư mục hiện hành
    • GetFiles Trả về một mảng đối tượng kiểu FileInfo gồm các tập tin trong thư mục hiện hành
    • GetFileSystemInfos Trả về đối tượng kiểu FileSystemInfo gồm các tập tin và thư mục trong thư mục hiện hành
    • MoveTo Di chuyển thư mục hiện hành sang vị trí khác

Ví dụ: Duyệt qua các tập tin có trong thư mục Windows:

DirectoryInfo ourDir = new DirectoryInfo(@"c:\windows");
Console.WriteLine("Directory: {0}", ourDir.FullName);
foreach (FileInfo file in ourDir.GetFiles())
{
    Console.WriteLine("File: {0}", file.Name);
}

DriveInfo Class

  • DirectoryInfo cung cấp các chức năng cơ bản để truy xuất và thao tác với một ổ đĩa trong hệ thống tập tin.
  • Bảng các thuộc tính chính của DriveInfo
    • AvailableFreeSpace Trả về kích thước còn trống cho phép lưu trữ
    • DriveFormat Trả về thông tin định dạng của ổ đĩa ( , NTFS, FAT32…)
    • DriveType Trả về kiểu của ổ đĩa (ổ đĩa cứng, CDRom…)
    • IsReady Trả về trạng thái của ổ đĩa (có sẵn sàng cho phép truy xuất hay không).
    • Name Tên của ổ đĩa.
    • TotalFreeSpace Trả về tổng kích thước còn trống của ổ đĩa.
    • TotalSize Trả về tổng kích thước của ổ đĩa.
    • VolumeLabel Trả về nhãn của ổ đĩa
    • GetDrives Trả về tất cả các ổ đĩa hiện có trên hệ thống (phương thức tĩnh – static)

Ví dụ: duyệt á qua các ổ đĩa có t h rong hệ thống

DriveInfo[] drivers = DriveInfo.GetDrives();
foreach (DriveInfo drive in drivers)
{
    Console.WriteLine("Drive: {0}", drive.Name);
    Console.WriteLine("Type: {0}", drive.DriveType);
}

Path Class

  • Path cung cấp các chức năng cơ bản để truy xuất và thao tác với đường dẫn hệ thống tập tin.
  • Bảng các phương thức chính của Path
    • ChangeExtension Trả về chuỗi đường dẫn đống thời đổi phần mở rộng của tập tin trong chuỗi đường dẫn
    • Combine Trả về 1 chuỗi đường dẫn bằng cách kết hợp 2 chuỗi đường dẫn.
    • GetDirectoryName Trả về tên của thư mục hiện hành
    • GetExtension Trả về kiểu của tập tin hiện hành
    • GetFileName Trả về tên của tập tin hiện hành
    • GetFileNameWithoutExtension Trả về kiểu của tập tin hiện hành không có phần kiểu
    • GetFullPath Trả về đường dẫn đầy đủ dựa vào đường dẫn tương đối được cung cấp
    • GetPathRoot Trả về thư mục gốc dựa vào đường dẫn được cung cấp
    • GetRandomFileName Trả về tập tin được lấy một cách ngẫu nhiên
    • GetTempFileName Trả về tên của thư mục tạm (thư mục temp) ứng với người dùng hiện hành
    • GetTempPath Trả về đường dẫn đến thư mục tạm (thư mục temp)
    • HasExtension Kiểm tra trong đường dẫn có phần mở rộng của tập tin hay không
    • IsPathRooted Kiểm tra đường dẫn có bắt đầu từ thư mục gốc (tên ổ đĩa) hay không

Ví dụ: thay đổi h phần mở rộng của tập tin

string ourPath = @"c:\mastercode.ini";
Console.WriteLine(ourPath);
Console.WriteLine("Ext: {0}", Path.GetExtension(ourPath));
Console.WriteLine("Change Path: {0}", Path.ChangeExtension(ourPath, "bak"));

FileSystemWatcher Class

  • FileSystemWatcher cung cấp các chức năng cơ bản để giám sát các thay đổi trong hệ thống tập tin và thư mục.
  • Bảng các thuộc tính chính của FileSystemWatcher
    • EnableRaisingEvents Lấy và thiết lập thông tin cho phép phát sinh sự kiện
    • Filter Lấy và thiết lập danh sách tập tin sẽ được lọc khi giám sát. Nếu không thiết lập thì sẽ giám sát tất cả các tập tin
    • IncludeSubdirectories Cho phép giám sát các thư mục con hay không
    • NotifyFilter Chế độ giám sát. Mặc định sẽ giám sát tất cả thay đổi (tạo, xóa, đổi tên và hiệu chỉnh nội dung trong tập tin)
    • Path Đường dẫn đến thư mục cần giám sát
    • WaitForChanged Phương thức đồng bộ trong việc giám sát một thư mục và trả về cấu trúc bao gồm tất cả thay đổi trên thư mục đó
    • Changed Xảy ra khi một tập tin hay một thư mục bị thay đổi trong thư mục được giám sát
    • Created Xảy ra khi một tập tin hay một thư mục vừa mới được tạo trong thư mục được giám sát
    • Deleted Xảy ra khi một tập tin hay một thư mục bị xóa trong thư mục được giám sát
    • Renamed Xảy ra khi một tập tin hay một thư mục bị đổi tên trong thư mục được giám sát

Ví dụ 1: giám sát việc tạo và xóa tập tin, thư mục trên thư mục gốc đĩa C:\

static void watcher_Change(object sender,FileSystemEventArgs e){
    Console.WriteLine("Directory change({0} : {1})", e.ChangeType, e.FullPath);
}
static void Main(string[] args){
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = @"C:\";
    //Chỉ định phương thức xử lý cho sự kiện
    watcher.Created += new FileSystemEventHandler(watcher_Change);
    watcher.Deleted += new FileSystemEventHandler(watcher_Change);
    //Bắt đầu giám sát
    watcher.EnableRaisingEvents = true;
    Console.ReadLine();
}

Ví dụ 2: giám sát việc sửa đổi tên tập tin và thư mục trên thư mục gốc đĩa C:\

static void watcher_Rename(object sender,RenamedEventArgs e){
    Console.WriteLine("Rename from {0} to {1}", e.OldFullPath, e.FullPath);
}
static void Main(string[] args){
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = @"C:\";
    //Chỉ định phương thức xử lý cho sự kiện
    watcher.Renamed += new RenamedEventHandler(watcher_Rename);
    //Bắt đầu giám sát
    watcher.EnableRaisingEvents = true;
    Console.ReadLine();
}

Xử lý đọc ghi tập tin

  • Stream
  • Directory, File
  • FileStream
  • StreamReader, StreamWriter
  • StringReader, StringWriter
  • BinaryReader, BinaryWriter
  • MemoryStream BufferedStream

Bài viết tiếp theo

Chia sẽ bài viết :