[ C# ] Làm việc với File và Directory trong C#

.NET Framework của Microsoft 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. Bài viết sau đây sẽ hướng dẫn các bạn một số phương thức và lớp rất hữu dụng khi thao tác với tập tin/thư mục.

Trong tất cả các đoạn code sau này, chúng ta lưu ý đều phải có chỉ dẫn tham chiếu đến System.IO như sau ở đầu:

using System.IO;

Lấy thông tin về File, Directory hoặc Drive

Thông qua các lớp FileInfo, DirectoryInfo và DriveInfo, chúng ta có thể lấy được thông tin về đối tượng như: ngày khởi tạo, kích thước, phần mở rộng, thuộc tính… Ví dụ sau đây cho phép chúng ta nhập vào đường dẫn đến một tập tin và sẽ hiển thị thông tin về tập tin, thư mục cha và ổ đĩa chứa tập tin đó.

using System; 
using System.Collections.Generic; 
using System.IO; 
namespace Example 
  class Test 
   { 
     public static void Main() 
      { 
        Console.Write("Enter file path:"); 
        string filePath = Console.ReadLine(); 
        Console.WriteLine("File Information"); 
        FileInfo fileInfo = new FileInfo(filePath); 
        if (fileInfo.Exists) 
          { 
             Console.WriteLine("Creation Time: " + fileInfo.CreationTime.ToString()); 
             Console.WriteLine("Last Access Time: " + fileInfo.LastAccessTime.ToString());                           
             Console.WriteLine("File Length (bytes): " + fileInfo.Length.ToString()); 
             Console.WriteLine("File Attributes: " + fileInfo.Attributes.ToString()); 
        } Console.WriteLine();   
           Console.WriteLine("Directory Information"); 
           DirectoryInfo directoryInfo = fileInfo.Directory; 
           if (directoryInfo.Exists) 
            { 
               Console.WriteLine("Creation Time: " + directoryInfo.CreationTime.ToString());             
               Console.WriteLine("Last Access Time: " + directoryInfo.LastAccessTime.ToString());    
               Console.WriteLine("Directory contains: " + directoryInfo.GetFiles().Length.ToString() + " files"); 
           } Console.WriteLine(); 
              Console.WriteLine("Drive Information"); 
              DriveInfo driveInfo = new DriveInfo(fileInfo.FullName); 
              if (driveInfo.IsReady) 
                 { 
                    Console.WriteLine("Drive Name: " + driveInfo.Name); 
                    Console.WriteLine("Drive Type: " + driveInfo.DriveType.ToString());          
                    Console.WriteLine("Drive Format: " + driveInfo.DriveFormat.ToString());
                    Console.WriteLine("Drive Free Space: " + driveInfo.AvailableFreeSpace.ToString()); 
                  } Console.ReadKey(); 
           } 
       } 
   }

Đầu tiên, chúng ta sẽ yêu cầu người dùng nhập vào đường dẫn đến một tập tin bất kỳ trên máy tính. Dựa trên đường dẫn này, chúng ta sẽ tạo ra đối tượng FileInfo để lấy thông tin về tập tin
Console.Write("Enter file path:"); 
string filePath = Console.ReadLine(); 
FileInfo fileInfo = new FileInfo(filePath);

Điều mà trước hết phải làm là kiểm tra xem thử tập tin này có thực sự tồn tại hay không. Lưu ý là mặc dù đường dẫn của chúng ta có đúng hay sai thì đối tượng fileInfo vẫn sẽ được tạo ra (không bao giờ NULL). Chúng ta sẽ dựa vào thuộc tính Exists để kiểm tra xem tập tin đó có tồn tại hay không. Sau khi đã kiểm tra được chắn chắn là tập tin này tồn tại, chúng ta lấy ra các thông tin về tập tin đó bao gồm: Thời gian khởi tạo, Thời gian truy cập cuối cùng, Thuộc tính và Kích thước của tập tin. Ngoài ra, chúng ta còn có thể lấy được các thông tin khác từ đối tượng FileInfo cũng như nhiều phương thức có thể được gọi từ lớp này (chi tiết xem tại MSDN: FileInfo)

Việc tiếp theo là chúng ta in ra thông tin thư mục chứa tập tin đã chỉ định. Thuộc tính Directory của fileInfo sẽ trả về một đối tượng DirectoryInfo của thư mục cha, dựa trên đối tượng này, chúng ta có thể lấy ra thông tin của thư mục tương tự như thông tin của tập tin:

DirectoryInfo directoryInfo = fileInfo.Directory; 
if (directoryInfo.Exists) 
 { 
   Console.WriteLine("Creation Time: " + directoryInfo.CreationTime.ToString()); 
   Console.WriteLine("Last Access Time: " + directoryInfo.LastAccessTime.ToString()); 
   Console.WriteLine("Directory contains: " + directoryInfo.GetFiles().Length.ToString() + " files"); 
}

Cuối cùng, chúng ta lấy thông tin về ổ đĩa chứa tập tin đã chỉ định. Lưu ý rằng đối tượng FileInfo không có thuộc tính nào để trả về đối tượng DriveInfo của ổ đĩa chứa nó, do đó chúng ta sẽ phải tạo ra một đối tượng DriveInfo bằng cách truyền vào hàm khởi tạo của nó một đường dẫn hợp lệ bắt đầu từ ổ đĩa đó. Sau đó, chúng ta phải kiểm tra thuộc tính IsReady của ổ đĩa này nhằm chắc chắn rằng nó thực sự tồn tại (ví dụ trong trường hợp chúng ta lấy về thông tin ổ đĩa DVD mà lại chưa bỏ đĩa vào thì chắc chắn IsReady của nó bằng False)

DriveInfo driveInfo = new DriveInfo(fileInfo.FullName); 
if (driveInfo.IsReady) 
 { 
   Console.WriteLine("Drive Name: " + driveInfo.Name); 
   Console.WriteLine("Drive Type: " + driveInfo.DriveType.ToString()); 
   Console.WriteLine("Drive Format: " + driveInfo.DriveFormat.ToString()); 
   Console.WriteLine("Drive Free Space: " + driveInfo.AvailableFreeSpace.ToString()); 
}

Sao chép, di chuyển và xóa tập tin hoặc thư mục

Dựa trên các đối tượng FileInfo và DriveInfo đã tạo ra ở trên mà chúng ta có thể gọi các phương thức để thực hiện việc Sao chép, di chuyển và xóa tập tin/thư mục. Các phương thức quan trọng của các lớp FileInfo là:
CopyTo: Sao chép tập tin đến đường dẫn được chỉ định và trả về đối tượng FileInfo của tập tin vừa được sao chép. Ví dụ sao chép tập tin đến ổ C: fileInfo.CopyTo(@“C:\” + fileInfo.Name); (các bạn lưu ý kí tự @ trước chuỗi để khỏi phải gõ ký tự \ hai lần.
Delete: Xóa tập tin vĩnh viễn nếu nó thực sự tồn tại. Lưu ý rằng phương thức này sẽ xóa trực tiếp tập tin vĩnh viễn chứ không phải là di chuyển tập tin đó đến thùng rác. Phiên bản hiện tại của C# không có cung cấp phương thức nào để chúng ta di chuyển tập tin đến thùng rác mà chúng ta cần phải tham chiếu đến thư viện của Visual Basic. Xem thêm tại:Delete File to Recycle Bin in C#
MoveTo: Di chuyển tập tin này đến vị trí mới. Phương thức này cũng được dùng để đổi tên một tập tin mà không thay đổi đường dẫn của nó. Ví dụ di chuyển tập tin đến ổ C: fileInfo.MoveTo(@”C:\” + fileInfo.Name);
Replace: Thay thế nội dung của tập tin nào đó được chỉ định bằng nội dung của tập tin chứa trong đối tượng FileInfo
Đối với thư mục thì chúng ta có các phương thức sau đây nằm trong lớpDirectoryInfo:
Create: Tạo ra một thư mục mới từ đối tượng DirectoryInfo
CreateSubdirectory: Tạo ra thư mục con chứa trong đường dẫn được chỉ định
Delete: Xóa thư mục
MoveTo: Di chuyển thư mục (kể cả nội dung bên trong) đến đường dẫn mới nằm trên cùng một ổ đĩa. Phương thức MoveTo cũng được dùng để đổi tên thư mục.
Làm việc với các lớp Path, File và Directory

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. Ngoài ra, lớp Path còn có các phương thức tiện ích khác hỗ trợ rất nhiều khi lập trình, chi tiết xem tại: MSDN: Path class
Lớp File và Directory được dùng để thao tác trên tập tin và thư mục tương tự như lớp FileInfo và DirectoryInfo. Tuy nhiên, điểm khác biệt là chúng ta sẽ thao tác chủ yếu qua các đường dẫn đến tập tin/thư mục chứ không cần phải tạo ra một đối tượng FileInfo hoặc DirectoryInfo. 

Một số ví dụ:
//Sao chép tập tin:  
  File.Copy(@"C:\abc.txt", @"F:\Temp\test.txt"); 
//Xóa tập tin:  
  File.Delete(@"C:\abc.txt"); 
//Di chuyển tập tin:  
  File.Move(@"C:\abc.txt", @"F:\Temp\test.txt");
//trả về mảng chuỗi các tập tin trong thư mục MyFolder của ổ đĩa C: 
  Directory.GetFiles(@"C:\MyFolder\");

Các bạn có thể xem thêm tại MSDN: File classDirectory class

Tổng kết:
Trong bài hôm nay, chúng ta đã tìm hiểu qua về cách thức lấy thông tin từ tập tin, thư mục và ổ đĩa cũng như một số thao tác cơ bản như Sao chép, Di chuyển, Xóa. Chúng ta cũng đã tìm hiểu qua về những phương thức tĩnh trong các lớp Path, File và Directory để làm việc dựa trên các đường dẫn đến tập tin và thư mục. Có một lưu ý khi các bạn làm việc với các tập tin, thư mục là chúng ta cần phải quan tâm đến quyền truy nhập đến tập tin/thư mục đó là như thế nào để chắc chắn ứng dụng của chúng ta hoạt động bình thường trên các máy tính khác nhau. Trong bài tiếp theo, chúng ta sẽ tìm hiểu làm thế nào để tạo một cây thư mục như trong Windows Explorer bằng TreeView.

Nguồn: Chienuit

Tìm kiếm nội dung khác: