C# Cơ bản .NET Core §1 Cài đặt, chương trình C# đầu tiên §2 Biến, kiểu dữ liệu và nhập/xuất §3 Toán tử số học và gán §4 So sánh, logic và lệnh if, switch §5 Vòng lặp for, while §6 Phương thức - Method §7 Chuyển số thành chữ §8 Phương thức - Delegate §9 Lớp - Class §10 Namespace §11 Partial, Nested §12 Kiểu giá trị, tham chiếu §13 Kiểu vô danh và dynamic §14 Biểu thức lambda §15 Event §16 Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §17 null và nullable §18 Mảng §19 Chuỗi ký tự §20 Tính kế thừa §21 Phương thức khởi tạo §22 Tính đa hình - abstract - interface §23 Struct và Enum §24 Ngoại lệ Exeption §25 IDisposable - using §26 File cơ bản §27 FileStream §28 Generic §29 Collection - List §30 SortedList §31 Queue / Stack §32 Linkedlist §33 Dictionary - HashSet §34 Phương thức mở rộng §35 ObservableCollection §36 LINQ §37 (Multithreading) async - bất đồng bộ §38 Type §39 Attribute Annotation §40 DI Dependency Injection §41 (Multithreading) Parallel §42 Thư viện lớp §43 (Networking) Uri, Dns, Ping §44 (Networking) HttpClient §45 (Networking) HttpMessageHandler §46 (Networking) HttpListener §47 (Networking) Tcp TcpListenerr/TcpClient §48 (ADO.NET) SqlConnection §49 (ADO.NET) SqlCommand §50 (ADO.NET) DataAdapter §51 (EF Core) Tổng quan §52 (EF Core) Tạo Model §53 (EF Core) Fluent API §54 (EF Core) Query §55 (EF Core) Scaffold §56 (EF Core) Migration §57 (ASP.NET CORE) Hello World! §58 (ASP.NET CORE) Middleware §59 (ASP.NET CORE) Map - Request - Response §60 (ASP.NET CORE) IServiceCollection - MapWhen §61 (ASP.NET CORE) Session - ISession §62 (ASP.NET CORE) Configuration §63 (ASP.NET CORE) Gửi Mail §64 (ASP.NET CORE) SASS/SCSS §65 (ASP.NET CORE) LibMan §66 (ASP.NET RAZOR) Khởi tạo và Route §67 (ASP.NET RAZOR) Cú pháp Razor §68 (ASP.NET RAZOR) Layout trong ASP.NET Core §69 (ASP.NET RAZOR) Partial §70 (ASP.NET RAZOR) ViewComponent §71 (ASP.NET RAZOR) TagHelper §72 (ASP.NET RAZOR) HtmlHelper §73 (ASP.NET RAZOR) PageModel §74 (ASP.NET RAZOR) Model Binding §75 (ASP.NET RAZOR) HTML Form, Validation §76 (ASP.NET RAZOR) Upload File §77 (ASP.NET RAZOR) Entity Framework §78 (ASP.NET RAZOR) Paging §79 (ASP.NET RAZOR) Identity (1) - Register, Login, Logout §80 (ASP.NET RAZOR) Identity (2) Lockout, Reset Password §81 (ASP.NET RAZOR) Identity (3) Google Login §82 (ASP.NET RAZOR) Identity (4) Facebook Login §83 (ASP.NET RAZOR) Identity (5) profile, password, email ... §84 (ASP.NET RAZOR) Identity (6) Role §85 (ASP.NET RAZOR) Identity (7) Role-based Authorization §86 (ASP.NET RAZOR) Identity (8) RoleClaim §87 (ASP.NET RAZOR) Identity (9) Authorization Handler §88 (ASP.NET RAZOR) IAuthorizationService §89 (ASP.NET MVC) Controller - View §90 (ASP.NET MVC) Route §91 (ASP.NET MVC) EF, Identity §92 (ASP.NET MVC) Binding, Validation §93 (ASP.NET MVC) Xây dựng Website(1) §94 (ASP.NET MVC) Xây dựng Website(2) §95 (ASP.NET MVC) Xây dựng Website(3) §96 (ASP.NET MVC) Xây dựng Website(4) §97 (ASP.NET MVC) Giỏ hàng - Cart (5) §98 (ASP.NET MVC) elFinder (5) §99 (ASP.NET MVC) SB Admin (6) §100 (ASP.NET MVC) Kestrel, publish
IDisposable - using (Bài trước)
(Bài tiếp) FileStream

Phần này tìm hiểu về hệ thống File, thư mục, ổ đĩa làm việc với .NET bằng C#. Như đọc thông tin ổ đĩa, đóng - mở file, copy file, xóa file, ghi dữ liệu ra file ...

Đọc thông tin ổ đĩa - DriveInfo

Thư viện .NET cung cấp lớp DriveInfo tại namespace System.IO giúp đọc thông tin các ổ đĩa có trong hệ thống. Phương thức DriveInfo.GetDrives() trả về mảng gồm các đối tượng DriveInfo, mỗi đối tượng chứa thông tin về một ổ đĩa. Có thể tham khảo các thuộc tính:

Các thuộc tính của lớp DriveInfo

Thuộc tính Ý nghĩa
IsReady true ổ đĩa ở trạng thái sẵn sàng (hoạt động) - ví dụ ổ đĩa CD nếu không có đĩa thì không sẵn sàng false
DriveType kiểu ổ đĩa (System.IO.DriveType) : CDRom, Fixed, Network, NoRootDirectory, Ram, Removable, Unknown
VolumeLabel Nhãn đĩa
DriveFormat Chuỗi cho biết định dạng đĩa: NTFS, FAT32, FAT, devfs ...
AvailableFreeSpace Số byte có hiệu lực còn trống (theo hạn ngạch người dùng)
TotalFreeSpace Số byte còn trống
TotalSize Tổng số byte trên đĩa
using System;
using System.IO;
namespace CS016_FilesDirectories {
    public class GetDriveInfomation {
        /// <summary>
        /// In các thông tin ổ đĩa trong máy
        /// </summary>
        public static void GetDrivesInfo () {
            DriveInfo[] allDrives = DriveInfo.GetDrives ();

            foreach (DriveInfo d in allDrives) {
                Console.WriteLine ("Drive {0}", d.Name);
                Console.WriteLine ("  Drive type: {0}", d.DriveType);
                if (d.IsReady == true) {
                    Console.WriteLine ("  Volume label: {0}", d.VolumeLabel);
                    Console.WriteLine ("  File system: {0}", d.DriveFormat);
                    Console.WriteLine ("  Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
                    Console.WriteLine ("  Total available space:          {0, 15} bytes", d.TotalFreeSpace);
                    Console.WriteLine ("  Total size of drive:            {0, 15} bytes ", d.TotalSize);
                }
            }
        }
    }
}

Khi áp dụng chạy:

GetDriveInfomation.GetDrivesInfo();

Kết quả in ra là các thông tin về các ổ đĩa trên máy:

Drive /
  Drive type: Fixed
  Volume label: /
  File system: apfs
  Available space to current user:   222470746112 bytes
  Total available space:             224261296128 bytes
  Total size of drive:               499455598592 bytes
Drive /dev
  Drive type: Ram
  Volume label: /dev
  File system: devfs
  Available space to current user:              0 bytes
  Total available space:                        0 bytes
  Total size of drive:                     193536 bytes 

Lớp Path - Hỗ trợ làm việc với đường dẫn

Để hỗ trợ quản lý, tạo các đường dẫn đến file, thư mục - nhất là hỗ trợ cross-platform thì lớp tĩnh System.IO.Path chứa các phương thức (tĩnh) với mục đích đó.

Phương thức Ý nghĩa
Path.DirectorySeparatorChar Thuộc tính chứa ký tự phân cách đường dẫn thư mục (\ trên Windows, / trên *nix)
Path.PathSeparator Thuộc tính chứa ký tự phân chia thư mục trong biến môi trường
Combine Kết hợp các chuỗi thành dường dẫn
var path = Path.Combine("home", "ReadMe.txt"); //  "home/ReadMe.txt"
ChangeExtension Thay đổi phần mở rộng của đường dẫn
var path = Path.ChangeExtension("/home/abc/ReadMe.txt", "md"); //  "/home/abc/ReadMe.md"
GetDirectoryName Lấy đường dẫn đến file (thư mục)
var path = Path.GetDirectoryName("/home/abc/zyz/ReadMe.txt"); //  "/home/abc/zyz"
GetExtension Lấy phần mở rộng
var path = Path.GetExtension("/home/ReadMe.txt"); //  ".txt"
GetFileName Lấy tên file
var path = Path.GetFileName("/home/abc/ReadMe.txt"); //  "ReadMe.txt"
GetFileNameWithoutExtension Lấy tên file
var path = Path.GetFileNameWithoutExtension("/home/ReadMe.txt"); //  "ReadMe"
GetFullPath Lấy đường dẫn đầy đủ - từ đường dẫn tương đối
var path = Path.GetFullPath("ReadMe.txt");
GetPathRoot Lấy gốc của đường dẫn
GetRandomFileName Tạo tên file ngẫu nhiên
var path = Path.GetRandomFileName();
GetTempFileName Tạo file duy nhất, rỗng
var path = Path.GetTempFileName();

Để lấy đường dẫn đến một số thư mục đặc biệt của hệ thống, có thể dùng phương thức Environment.GetFolderPath. Ví dụ, lấy thư mục MyDocument

var path_mydoc = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Làm việc với lớp File

Lớp System.IO.File cung cấp cho bạn cách thức đơn giản để làm việc với các tệp. Nó có nhiều phương thức cho những mục đích khác nhau File class, như copy, xóa, di chuyển, lưu text vào file, đọc nội dung file, kiểm tra sự tồn tại, tra cứu thông tin về file ...

File.WriteAllText

Hàm này tạo ra file mới (nếu đã có file bị ghi đè), ghi vào nó một nội dung text, rồi đóng file luôn. Ví dụ, lưu vào file test.txt một nội dung, file đó ở đường dẫn đến thư mục MyDocument của hệ thống.

static void testWriteAllText () {
    var filename = "test.txt";
    string contentfile = "Xin chào! xuanthulab.net";

    // Lấy thư mục Document của User trên hệ thống
    var directory_mydoc = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

    var fullpath = Path.Combine(directory_mydoc, filename);
    File.WriteAllText (filename, contentfile);

    Console.WriteLine ($"File lưu tại {directory_mydoc}{Path.DirectorySeparatorChar}{filename}");

}

Với WriteAllText file luôn được tạo mới (ghi đè), nếu file đó đã tồn tại - bạn muốn nối thêm nội dung vào nội dung có sẵn thì hãy dùng đến AppendAllText. Ví dụ sau, nếu file đã tồn tại thì nối thêm nội dung, nếu chưa tồn tại thì tạo mới.

static void testAppendAllText() {

    var filename = "test.txt";
    string contentfile = "\nXin chào! xuanthulab.net - " + DateTime.Now.ToString ();

    var directory_mydoc = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
    var fullpath = Path.Combine (directory_mydoc, filename);

    if (File.Exists (fullpath)) {
        // File đã tồn tại - nối thêm nội dung
        File.AppendAllText (fullpath, contentfile);
    } else {
        // tạo mới vì chưa tồn tại file
        File.WriteAllText (fullpath, contentfile);
    }
    // Đọc nội dung File
    Console.WriteLine (fullpath);
    string s = File.ReadAllText (fullpath);
    Console.WriteLine (s);
}

File.ReadAllText

Hàm này thì đọc nội dung file.

string s = File.ReadAllText(fullpath);
Console.Write(s);

Ngoài ra bạn cũng có thể sử dụng các phương thức

  • File.Create(filename) tạo file
  • File.Delete(filename) xóa file
  • File.Exists(filename) kiểm tra file có tồn tại
  • File.Copy(path_src, path_des) copy file
  • File.Move(path_src, path_des) di chuyển file

Làm việc với lớp Directory

Lớp System.IO.Directory cung cấp các phương thức chuyên tương tác với các thư mục.

Phương thức Ý nghĩa
Exists(path) Kiểm tra xem thư mục có tồn tại (true) hay không (false)
CreateDirectory(path) Tạo thư mục, trả về đối tượng System.IO.DirectoryInfo chứa thông tin thư mục.
Delete(path) Xóa thư mục.
GetFiles(path) Lấy các file trong thư mục.
GetDirectories(path) Lấy các thư mục trong thư mục.
Move(src, des) Di chuyển thư mục.

Ví dụ lấy tất cả các thư mục, file trong một thư mục

var directory_mydoc = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
String[] files = System.IO.Directory.GetFiles(directory_mydoc);
String[] directories = System.IO.Directory.GetDirectories(directory_mydoc);

foreach (var file in files)
{
    Console.WriteLine(file);
}

foreach(var directory in directories)
{
    Console.WriteLine(directory);
}

Ví dụ đệ quy liệt kê tất cả các file, thư mục con trong một thư mục

static void ListFileDirectory(string path)
{
    String[] directories = System.IO.Directory.GetDirectories(path);
    String[] files = System.IO.Directory.GetFiles(path);
    foreach (var file in files)
    {
        Console.WriteLine(file);
    }
    foreach (var directory in directories)
    {
        Console.WriteLine(directory);
        ListFileDirectory(directory); // Đệ quy
    }
}

Chạy thử

var directory_mydoc = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
ListFileDirectory(directory_mydoc);

Tham khảo mã nguồn CS016_FilesDirectories(git) hoặc tải về ex016

IDisposable - using (Bài trước)
(Bài tiếp) FileStream