Thao tác với tập tin và thư mục trong C#
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Sơ đồ thừa kế các class

Class Mô tả
File File là một class tiện ích. Nó cung cấp các phương thức tĩnh cho việc tạo, copy, xóa, di chuyển và mở một file, và hỗ trợ tạo đối tượng FileStream.
Directory Directory là một class tiện ích. Nó cung cấp các phương thức tĩnh để tạo, di chuyển, và liệt kê các thư mục và các thư mục con. Class này không cho phép có class con.
FileInfo FileInfo là một class mô tả một file, nó cung cấp các thuộc tính, phương thức cho việc tạo, copy, xóa, di chuyển và mở file. Nó hỗ trợ tạo đối tượng FileStream. Class này không cho phép có class con.
DirectoryInfo DirectoryInfo là một class đại diện cho một thư mục, nó cung cấp phương thức cho việc tạo, di chuyển, liệt kê các thư mục và các thư mục con. Class này không cho phép có class con.
DriveInfo DirveInfo là một class, nó cung truy cập các thông tin ổ cứng.

2- File

File là một class tiện ích. Nó cung cấp các phương thức tĩnh cho việc tạo, copy, xóa, di chuyển và mở một file, và hỗ trợ tạo đối tượng FileStream.
Ví dụ dưới đây kiểm tra xem một đường dẫn file có tồn tại hay không, nếu tồn tại xóa file này.
DeleteFileDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
 class DeleteFileDemo
 {
     public static void Main(string[] args)
     {
         string filePath = "C:/test/test.txt";

         // Kiểm tra file có tồn tại không.
         if (File.Exists(filePath))
         {
             // Xóa file
             File.Delete(filePath);

             // Kiểm tra lại xem file còn tồn tại không.
             if (!File.Exists(filePath))
             {
                 Console.WriteLine("File deleted...");
             }

         }
         else
         {
             Console.WriteLine("File test.txt does not yet exist!");
         }

         Console.ReadKey();
     }
 }

}
Chạy ví dụ:
Đổi tên file là một hành động có thể bao gồm di chuyển file tới một thư mục khác và đổi tên file. Trong trường hợp file bị di chuyển tới một thư mục khác phải đảm bảo rằng thư mục mới tồn tại.
RenameFileDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
  class RenameFileDemo
  {
      public static void Main(string[] args)
      {
          String filePath = "C:/test/test.txt";

          if (File.Exists(filePath))
          {
              Console.WriteLine(filePath + " exist");

             
              Console.WriteLine("Please enter a new name for this file:");
             
              // String người dùng nhập vào.
              // Ví dụ: C:/test/test2.txt
              string newFilename = Console.ReadLine();

              if (newFilename != String.Empty)
              {                    
                  // Đổi tên file.
                  // Bạn có thể chuyển file tới một thư mục khác
                  // nhưng phải đảm bảo thư mục đó tồn tại
                  // (nếu không ngoại lệ DirectoryNotFoundException sẽ được ném ra).
                  File.Move(filePath, newFilename);

                  if (File.Exists(newFilename))
                  {
                      Console.WriteLine("The file was renamed to " + newFilename);
                  }
              }
          }
          else
          {
              Console.WriteLine("Path " + filePath + " does not exist.");
          }

          Console.ReadLine();
      }
  }

}
Chạy ví dụ:

3- Directory

Directory là một class tiện ích. Nó cung cấp các phương thức tĩnh để tạo, di chuyển, và liệt kê các thư mục và các thư mục con. Class này không cho phép có class con.
Ví dụ kiểm tra một đường dẫn thư mục có tồn tại hay không, nếu không tồn tại tạo thư mục đó, ghi ra thông tin thời gian tạo, lần ghi dữ liệu cuối vào thư mục, ....
DirectoryInformationDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
  class DirectoryInformationDemo
  {
      public static void Main(string[] args)
      {
          String dirPath = "C:/test/CSharp";

          // Kiểm tra xem đường dẫn thư mục tồn tại không.
          bool  exist = Directory.Exists(dirPath);
         
          // Nếu không tồn tại, tạo thư mục này.
          if (!exist)
          {
              Console.WriteLine(dirPath + " does not exist.");
              Console.WriteLine("Create directory: " + dirPath);

              // Tạo thư mục.
              Directory.CreateDirectory(dirPath);
          }

          Console.WriteLine("Directory Information " + dirPath);

          // In ra các thông tin thư mục trên.

          // Thời gian tạo.
          Console.WriteLine("Creation time: "+ Directory.GetCreationTime(dirPath));

          // Lần ghi dữ liệu cuối cùng vào thư mục.
          Console.WriteLine("Last Write Time: " + Directory.GetLastWriteTime(dirPath));

          // Thông tin thư mục cha.
          DirectoryInfo parentInfo = Directory.GetParent(dirPath);

          Console.WriteLine("Parent directory: " + parentInfo.FullName);


          Console.Read();
      }
  }
 
}
Chạy ví dụ:
Đổi tên thư mục:
Bạn có thể thay đổi tên một thư mục. Nó có thể làm thư mục đó chuyển ra khỏi thư mục cha hiện tại. Nhưng bạn phải đảm bảo rằng thư mục cha mới đã tồn tại. Ví dụ dưới đây minh họa đổi tên một thư mục:
RenameDirectoryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
  class RenameDirectoryDemo
  {
      public static void Main(string[] args)
      {
          // Một đường dẫn thư mục.
          String dirPath = "C:/test/CSharp";

          // Nếu đường dẫn này tồn tại.
          if (!Directory.Exists(dirPath))
          {
              Console.WriteLine(dirPath + " does not exist.");
              Console.Read();
              // Kết thúc chương trình.
              return;
          }

          Console.WriteLine(dirPath + " exist");


          Console.WriteLine("Please enter a new name for this directory:");

          // String người dùng nhập vào.
          // Ví dụ: C:/test2/Java
          string newDirname = Console.ReadLine();

          if (newDirname == String.Empty)
          {
              Console.WriteLine("You not enter new directory name. Cancel rename.");
              Console.Read();
              // Kết thúc chương trình.
              return;
          }

          // Nếu người dùng nhập vào đường dẫn thư mục mới đã tồn tại.
          if (Directory.Exists(newDirname))
          {
              Console.WriteLine("Cannot rename directory. New directory already exist.");
              Console.Read();
              // Kết thúc chương trình.
              return;
          }

          DirectoryInfo parentInfo = Directory.GetParent(newDirname);

          // Tạo thư mục cha của thư mục mới mà người dùng nhập vào.
          Directory.CreateDirectory(parentInfo.FullName);


          // Đổi tên thư mục.
          // Bạn có thể chuyển thư mục tới một thư mục khác
          // nhưng phải đảm bảo thư mục đó tồn tại
          // (nếu không ngoại lệ DirectoryNotFoundException sẽ được ném ra).
          Directory.Move(dirPath, newDirname);

          if (Directory.Exists(newDirname))
          {
              Console.WriteLine("The directory was renamed to " + newDirname);
          }


          Console.ReadLine();
      }
  }

}
Chạy ví dụ:
Ví dụ dưới đây đệ quy và in ra tất cả các thư mục con, cháu,... của một thư mục.
EnumeratingDirectoryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
class EnumeratingDirectoryDemo
{
    public static void Main(string[] args)
    {
        string dirPath = "C:/Windows/System32";

        PrintDirectory(dirPath);

        Console.Read();
    }


    // Phương thức đệ quy liệt kê các thư mục con của một thư mục.
    public static void PrintDirectory(string dirPath)
    {
        try
        {
            // Một đối tượng có thể duyệt trên các thư mục con trực tiếp của thư mục dirPath.
            // Nếu không có quyền truy cập thư mục 'dirPath'
            // một ngoại lệ UnauthorizedAccessException sẽ được ném ra.
            IEnumerable<string> enums = Directory.EnumerateDirectories(dirPath);

            // Danh sách
            List<string> dirs = new List<string>(enums);

            foreach (var dir in dirs)
            {
                Console.WriteLine(dir);

                // Đệ quy tìm kiếm các thư mục con.
                PrintDirectory(dir);
            }
        }
        // Lỗi khi truy cập vào thư mục không có quyền.
        catch (UnauthorizedAccessException e)
        {
            Console.WriteLine("Can not access directory: " + dirPath);
            Console.WriteLine(e.Message);
        }
    }
}

}
Chạy ví dụ:

4- FileInfo

FileInfo là một class mô tả một file, nó cung cấp các thuộc tính, phương thức cho việc tạo, copy, xóa, di chuyển và mở file. Nó hỗ trợ tạo đối tượng FileStream. Class này không cho phép có class con.
Sự khác biệt giữa 2 class FileFileInfo đó là File là một class tiện ích các phương thức của nó là tĩnh, còn FileInfo đại diện cho một file cụ thể.
FileInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
  class FileInfoDemo
  {
      static void Main(string[] args)
      {
          // Một đối tượng đại diện cho một file.
          FileInfo testFile = new FileInfo("C:/test/test.txt");

          // Ghi ra các thông tin.

          if (testFile.Exists)
          {
              Console.WriteLine(testFile.FullName + " exist.");

              // Thông tin ngày tạo.
              Console.WriteLine("Creation time: " + testFile.CreationTime);

              // Thông tin ngày sửa cuối.
              Console.WriteLine("Last Write Time " + testFile.LastWriteTime);

              // Tên thư mục chứa.
              Console.WriteLine("Directory Name: " + testFile.DirectoryName);
          }
          else
          {
              Console.WriteLine(testFile.FullName + " does not exist.");
          }
          Console.Read();
      }
  }

}
Chạy ví dụ:
Đổi tên file là một hành động có thể bao gồm di chuyển file tới một thư mục khác và đổi tên file. Trong trường hợp file bị di chuyển tới một thư mục khác phải đảm bảo rằng thư mục mới tồn tại.
RenameFileInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
  class RenameFileInfoDemo
  {
      public static void Main(string[] args)
      {

          FileInfo fileInfo = new FileInfo("C:/test/test.txt");

          if (!fileInfo.Exists)
          {
              Console.WriteLine(fileInfo.FullName + " does not exist.");
              Console.Read();
              // Kết thúc chương trình.
              return;
          }


          Console.WriteLine(fileInfo.FullName + " exist");


          Console.WriteLine("Please enter a new name for this file:");

          // String người dùng nhập vào.
          // Ví dụ: C:/test/test2.txt
          string newFilename = Console.ReadLine();

          if (newFilename == String.Empty)
          {
              Console.WriteLine("You not enter new file name. Cancel rename");

              Console.Read();
              // Kết thúc chương trình.
              return;
          }

          FileInfo newFileInfo = new FileInfo(newFilename);

          // Nếu newFileInfo tồn tại (Không thể đổi tên).
          if (newFileInfo.Exists)
          {
              Console.WriteLine("Can not rename file to " + newFileInfo.FullName + ". File already exist.");

              Console.Read();
              // Kết thúc chương trình.
              return;
          }

          // Đảm bảo rằng thư mục chuyển tới tồn tại.
          newFileInfo.Directory.Create();


          // Đổi tên file.
          fileInfo.MoveTo(newFileInfo.FullName);

          // Refresh trạng thái.
          newFileInfo.Refresh();

          if (newFileInfo.Exists)  
          {
              Console.WriteLine("The file was renamed to " + newFileInfo.FullName);
          }

          Console.ReadLine();
      }
  }

}
Chạy ví dụ:

5- DirectoryInfo

DirectoryInfo là một class đại diện cho một thư mục, nó cung cấp phương thức cho việc tạo, di chuyển, liệt kê các thư mục và các thư mục con. Class này không cho phép có class con.
Sự khác biệt giữa 2 class DirectoryDirectoryInfo đó là Directory là một class tiện ích các phương thức của nó là tĩnh, còn DirectoryInfo đại diện cho một thư mục cụ thể.
DirectoryInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
  class DirectoryInfoDemo
  {
      static void Main(string[] args)
      {
          // Một đối tượng đại diện cho một thư mục.
          DirectoryInfo dirInfo = new DirectoryInfo("C:/Windows/System32/drivers");

          // Ghi ra các thông tin.  
          // Thông tin ngày tạo.
          Console.WriteLine("Creation time: " + dirInfo.CreationTime);

          // Thông tin ngày sửa cuối.
          Console.WriteLine("Last Write Time " + dirInfo.LastWriteTime);

          // Tên thư mục chứa.
          Console.WriteLine("Directory Name: " + dirInfo.FullName);


          // Mảng các thư mục con.
          DirectoryInfo[] childDirs = dirInfo.GetDirectories();
          // Mảng các file con.
          FileInfo[] childFiles = dirInfo.GetFiles();

          foreach(DirectoryInfo childDir in childDirs ){
              Console.WriteLine(" - Directory: " + childDir.FullName);
          }

          foreach (FileInfo childFile in childFiles)
          {
              Console.WriteLine(" - File: " + childFile.FullName);
          }


          Console.Read();
      }
  }

}
Chạy ví dụ:

6- DriveInfo

DirveInfo là một class, nó cung truy cập các thông tin ổ cứng.
DriveInfoDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileDirectoryTutorial
{
  class DriveInfoDemo
  {
      static void Main(string[] args)
      {
          DriveInfo[] drives = DriveInfo.GetDrives();

          foreach (DriveInfo drive in drives)
          {
              Console.WriteLine(" ============================== ");
              // Tên ổ đĩa
              Console.WriteLine("Drive {0}", drive.Name);
              // Loại ổ đĩa
              Console.WriteLine("  Drive type: {0}", drive.DriveType);

              // Nếu ổ đĩa sẵn sàng.
              if (drive.IsReady)
              {
                  Console.WriteLine("  Volume label: {0}", drive.VolumeLabel);
                  Console.WriteLine("  File system: {0}", drive.DriveFormat);
                  Console.WriteLine(
                      "  Available space to current user:{0, 15} bytes",
                      drive.AvailableFreeSpace);

                  Console.WriteLine(
                      "  Total available space:          {0, 15} bytes",
                      drive.TotalFreeSpace);

                  Console.WriteLine(
                      "  Total size of drive:            {0, 15} bytes ",
                      drive.TotalSize);
              }
          }

          Console.Read();
      }
  }

}
Chạy ví dụ: