logo

Tạo Ứng dụng Duyệt File và thư mục đơn giản với C Sharp


Tạo Ứng dụng Duyệt File và thư mục đơn giản với C Sharp Bài viết này giới thiệu cách lấy các thông tin của các Ổ đĩa hệ thống và cách lấy thông tin về các thư mục và File để phân bố vào các điều khiển Treeview và listview. Đây là một ứng dụng đơn giản của WinForm. Trước hết, ta cần thu thập tất cả các thông tin về tất cả các Ổ đĩa trong My Computer mà chúng ta có thể truy cập vào và hiển thị tên là loại Ổ trong điều khiển Treeview. Chúng ta có thể truy vấn thông qua lớp ManagementObjectSearcher trong không gian tên System.Management. Nó chấp nhận các câu lệnh SQL Như thực hiện các câu truy vấn và trả về một đối tượng ManagementOjbectCollection mà chứa tất cả các thông tin về Ổ đĩa mà chúng ta yêu cầu. bây giờ chúng ta đã có tất cả các thông tin về Ổ đĩa như: Tên Ổ đĩa, Loại, các mô tả... Ta viết hàm GetDrivers() để thực thi mục đích đó: protected ManagementObjectCollection GetDrivers() { ManagementObjectSearcher query = new ManagementObjectSearcher("Select * From Win32_LogicalDisk"); ManagementObjectCollection queryCollection = query.Get(); return queryCollection; } Khi ứng dụng được nạp lên chúng ta cần phải tìm tất cả các Ổ đĩa có trong My Computer và hiển thị chúng. private void PopulateDriveList() { TreeNode nodeTreeNode; int imageIndex = 0; int selectIndex = 0; const int Removable = 2; const int LocalDisk = 3; const int Network = 4; const int CD = 5; this.Cursor = Cursors.WaitCursor; // Xóa Treeview tvFolders.Nodes.Clear(); nodeTreeNode = new TreeNode("My Computer", 0, 0); tvFolders.Nodes.Add(nodeTreeNode); // Thiết lập tập hợp các Node TreeNodeCollection nodeCollection = nodeTreeNode.Nodes; // Lấy danh sách các ổ đĩa ManagementObjectCollection queryCollection = GetDrivers(); foreach (ManagementObject mo in queryCollection) { switch (int.Parse(mo["DriveType"].ToString())) { case Removable: // Các Ổ Đĩa Mềm imageIndex = 5; selectIndex = 5; break; case LocalDisk: // Các Ổ Đĩa Cứng imageIndex = 6; selectIndex = 6; break; case CD: // Các Ổ Đĩa CD imageIndex = 7; selectIndex = 7; break; case Network: // Các Ổ Liên Kết qua mạng imageIndex = 8; selectIndex = 8; break; default: imageIndex = 2; selectIndex = 3; break; } // Tạo một Driver Node mới nodeTreeNode = new TreeNode(mo["Name"].ToString() + "\\", imageIndex, selectIndex); // Chèn vào Treeview nodeCollection.Add(nodeTreeNode); } InitListView(); this.Cursor = Cursors.Default; } Và khởi tạo một Listview để hiển thị các thông tin về File trong Hàm InitListView(): protected void InitListView() { // Khởi tạo Listview ban đầu lvFiles.Clear(); //// Tạo các header cho Listview lvFiles.Columns.Add("Tên File", 140, HorizontalAlignment.Left); lvFiles.Columns.Add("Dung Lượng", 75, HorizontalAlignment.Right); lvFiles.Columns.Add("Ngày Tạo", 140, HorizontalAlignment.Right); lvFiles.Columns.Add("Ngày Sửa", 140, HorizontalAlignment.Right); } Khi chúng ta chọn một Ổ đĩa hoặc 1 thư mục trong Treeview, chúng ta cần kiểm tra xem Ổ đĩa hay thư mục đó có tồn tại hay không trước khi thực hiện các thao tác khác. Sau khi kiểm tra sự tồn tại của các thư mục trong Ổ đĩa, ta lấy tất cả các thư mục tồn tại khi chọn một Ổ đĩa trong Treeview bằng cách sử dụng lớp Directory trong không gian tên System.IO. Gọi hàm Directory.GetDirectories với tham số là đường dẫn của Node hiện thời và trả về một mảng các thư mục. chúng ta duyệt tất cả các thư mục trong mảng này và phân bố chúng vào các Node con. Hàm xử lý sự kiện nhấn và Treeview như sau: private void tvFolders_AfterSelect(object sender, TreeViewEventArgs e) { // Phân bố thư mục hoặc File khi một thư mục được chọn this.Cursor = Cursors.WaitCursor; // Lấy ổ đĩa hoặc thư mục đang được lựa chọn TreeNode currentNode = e.Node; // Xóa toàn bộ thư mục con currentNode.Nodes.Clear(); if (currentNode.SelectedImageIndex == 0) { // My Computer được chọn - Phân bố lại danh sách các ổ đĩa. PopulateDriveList(); } else { // Phân bố các thư mục con và các File. PopulateDirectory(currentNode, currentNode.Nodes); } this.Cursor = Cursors.Default; } Chúng ta kiểm tra xem Mục My Computer đã được mở rộng hay chưa? nếu chưa thì ta phải gọi hàm để phân bố danh sách các ổ đĩa. Còn ngược lại, ta duyệt tiếp các thư mục ở cấp độ nhỏ hơn bằng hàm PopulateDirectory(currentNode, currentNode.Nodes): protected void PopulateDirectory(TreeNode currentNode, TreeNodeCollection currentNodeCollection) { TreeNode nodeDir; int imageIndex = 2; // Chỉ mục ảnh khi không được chọn int selectIndex = 3; // Chỉ mục ảnh khi được chọn. if (currentNode.SelectedImageIndex != 0) { // phân bố các thư mục trong Treeview try { // Kiểm tra đường dẫn if (Directory.Exists(GetFullPath(currentNode.FullPath)) == false) { MessageBox.Show("Ổ đĩa hoặc thư mục " + currentNode.ToString() + " Không tồn tại"); } else { //Phân bố các Files. PopulateFiles(currentNode); string[] stringDirectories = Directory.GetDirectories(GetFullPath(currentNode.FullPath)); string stringFullPath = ""; string stringPathName = ""; // Lặp qua tất cả các thư mục foreach (string stringDir in stringDirectories) { stringFullPath = stringDir; stringPathName = GetPathName(stringDir); // Tạo các Node cho thư mục nodeDir = new TreeNode(stringPathName.ToString(), imageIndex, selectIndex); currentNodeCollection.Add(nodeDir); } } } catch (IOException e) { MessageBox.Show("Lỗi: Ổ đĩa không có hoặc thư mục không tồn tại."); } catch (UnauthorizedAccessException e) { MessageBox.Show("Lỗi: Bạn không có quyền truy cập vào ổ đĩa hoặc thư mục này"); } catch (Exception e) { MessageBox.Show("Lỗi " + e); } } } Đến bước này, chúng ta vừa duyệt các thư mục con và hiển thị các File ra Listview. Chúng ta viết Hàm PopulateFiles(TreeNode currentNode) để thực hiện điều này. Trong đó ta có sử dụng hàm Directory.GetFiles với tham số là đường dẫn của Node hiện thời. hàm này sẽ trả về một mảng các File trong Ổ đĩa hoặc thư mục lựa chọn. Ta duyệt qua tất cả các phần tử mảng và phân bố vào Listview. Lớp FileInfo lấy các thông tin chi tiết về File như Dung lượng, ngày tạo, ngày sửa đổi... protected void PopulateFiles(TreeNode currentNode) { string[] lvData = new string[4]; InitListView(); if (currentNode.SelectedImageIndex != 0) { // Kiểm tra đường dẫn if (Directory.Exists(GetFullPath(currentNode.FullPath)) == false) { MessageBox.Show("Thư mục hoặc đường dẫn" + currentNode.ToString() + "Không tồn tại"); } else { try { string[] stringFiles = Directory.GetFiles(GetFullPath(currentNode.FullPath)); string stringFileName = null; DateTime dtCreateDate, dtModifyDate; Int64 lFileSize = 0; // Duyệt tất cả các File. foreach (string stringFile in stringFiles) { stringFileName = stringFile; FileInfo objFileSize = new FileInfo(stringFileName); lFileSize = objFileSize.Length; dtCreateDate = objFileSize.CreationTime; dtModifyDate = objFileSize.LastWriteTime; // Ghi dữ liệu vào Listview lvData[0] = GetPathName(stringFileName); lvData[1] = FormatSize(lFileSize); lvData[2] = FormatDate(dtCreateDate); lvData[3] = FormatDate(dtModifyDate); ListViewItem lvItem = new ListViewItem(lvData, 0); lvFiles.Items.Add(lvItem); } } catch (IOException e) { MessageBox.Show("Lỗi: Ổ đĩa không có hoặc thư mục không tồn tại."); } catch (UnauthorizedAccessException e) { MessageBox.Show("Lỗi: Bạn không có quyền truy cập vào ổ đĩa hoặc thư mục này"); } catch (Exception e) { MessageBox.Show("Lỗi " + e); } } } } Tuy nhiên, ta cần phải chú ý đến định đạng kích cỡ của File là kiểu số. Phải có một hàm chuyển đổi và làm tròn các giá trị đó. Ta cần áp dụng lớp NumberFormatInfo trong không gian tên System.Globalization để định dạng các con số và chuyển sang định dạng chuỗi: protected string FormatSize(Int64 lSize) { string stringSize = ""; NumberFormatInfo myNfi = new NumberFormatInfo(); Int64 lKBSize = 0; if (lSize < 1024) { if (lSize == 0) { stringSize = "0"; } else stringSize = "1"; // Dung Lượng lớn hơn 0 và nhỏ hơn 1024 làm tròn thành 1 KB } else { lKBSize = lSize / 1024; // Chuyển sang định dạng chuẩn stringSize = lKBSize.ToString("n",myNfi); // Cắt bỏ phần thập phân. stringSize = stringSize.Replace(".00", ""); } return stringSize + " KB"; } Còn một số hàm đơn giản nữa như định dạng thời gian cho File protected string FormatDate(DateTime dtDate) { string stringDate = ""; stringDate = dtDate.ToShortDateString().ToString() + " " + dtDate.ToShortTimeString().ToString(); return stringDate; } Hàm Lấy Tên và đường dẫn của thư mục: protected string GetPathName(string stringPath) { string[] stringSplit = stringPath.Split('\\'); int _maxIndex = stringSplit.Length; return stringSplit[_maxIndex - 1]; } protected string GetFullPath(string stringPath) { string stringParse = ""; // Xóa bỏ My Computer khỏi đường dẫn stringParse = stringPath.Replace("My Computer\\", ""); return stringParse; }  
DMCA.com Protection Status Copyright by webtailieu.net