1. Trang chủ >
  2. Luận Văn - Báo Cáo >
  3. Báo cáo khoa học >

Lấy về danh sách các tập tin

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.57 MB, 369 trang )


C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



Hàm GetCheckedFiles() thêm danh sách tên các tập tin được đánh dấu của nút

hiện hành theNode vào đối tượng fileNames. Nếu nút truyền vào là nút lá và

được đánh dấu chọn, ta sẽ lấy đường dẫn đầy đủ của nút và thêm vào đối

tượng fileNames:

private void GetCheckedFiles(TreeNode node,

ArrayList fileNames)

{

if (node.Nodes.Count == 0)

{

if (node.Checked)

{

string fullPath = GetParentString(node);

fileNames.Add(fullPath);

}

}

Nếu không là nút lá, ta sẽ lập đệ qui để tìm nút lá :

else

{

foreach (TreeNode n in node.Nodes)

GetCheckedFiles(n,fileNames);

}

}

Sau khi thực hiện hết hàm này (nghĩa là duyệt hết cây tvwSource), đối tượng

fileNames sẽ chứa toàn bộ các tập tin được đánh dấu chọn của cây.

Quay trở lại khảo sát tiếp tục hàm GetFileList(), ta tạo thêm một đối tượng

ArrayList nữa, tên fileList. Mảng này sẽ chứa danh sách các đối tượng

FileInfo ứng với các tên tập tin tìm được trong mảng fileNames. Thuộc tính

Exists của đối tượng FileInfo dùng để kiểm tra là tập tin hay thư mục. Thuộc

tính Exists là True thì đối tượng FileInfo đó là tập tin và ta sẽ thêm vào mảng

fileList, ngược lại là thư mục thì không thêm .

foreach (string fileName in fileNames)

{

FileInfo file = new File(fileName);

if (file.Exists)

fileList.Add(file);

}



168



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



13.1.2.4 Quản lý sự kiện nhấn chọn nút xóa ( Delete )

Trước tiên ta cần đảm bảo rằng người dùng chắc chắn muốn xóa bằng cách

cho hiện lên một hộp thoại xác nhận xóa. Để hiển thị hộp thoại ta dùng hàm

tĩnh Show() của đối tượng MessageBox.

protected void btnDelete_Click( object sender,

System.EventArgs e)

{

System.Windows.Forms.DialogResult result =

MessageBox.Show( "Are you quite sure?",//

Thông điệp

"Delete Files",

// Tiêu đề cho

hộp thoại

MessageBox.Buttons.OKCancel,// nút nhấn

MessageBox.Icon.Exclamation,// biểu

tượng hộp thoại

MessageBox.DefaultButton.Button2); //

nút mặc định

}

Khi người dùng nhấn nút OK hay Cancel, ta sẽ nhận được giá trị trả về từ đối

tượng DialogResult thuộc namespace Forms và tiến hành xử lý tương ứng :

if (result ==

System.Windows.Forms.DialogResult.OK)

{

Nếu người dùng chọn nút OK thì ta sẽ lấy về danh sách tên các tập tin

fileNames, sau đó duyệt qua từng tên và xóa chúng đi :

ArrayList fileNames = GetFileList( );

foreach (FileInfo file in fileNames)

{

try

{

lblStatus.Text = "Deleting " +

txtTargetDir.Text + "\\" +

file.Name + "...";

Application.DoEvents( );

file.Delete( );

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);



169



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



}

}

lblStatus.Text = "Done.";

Application.DoEvents( );

Sau đây là mã của toàn bộ ứng dụng :

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Windows.Forms;

///

/// chép tập tin – ứng dụng minh họa cho Windows

Form

///


namespace FileCopier

{

///



/// Form minh họa cho ứng dụng Windows Form

///


public class Form1 : System.Windows.Forms.Form

{

///

/// lớp bên trong của lớp Form1, so sánh 2

tập tin

///


public class FileComparer : IComparer

{

public int Compare (object f1, object f2)

{

FileInfo file1 = (FileInfo) f1;

FileInfo file2 = (FileInfo) f2;

if (file1.Length > file2.Length)

{

return -1;

}

if (file1.Length < file2.Length)

{



170



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



return 1;

}

return 0;

}



}



public Form1( )

{

InitializeComponent( );

// đẩy dữ liệu vào cây bên trái và bên phải

FillDirectoryTree(tvwSource, true);

FillDirectoryTree(tvwTargetDir, false);

}



cây



///

/// phương thức này dùng để đẩy dữ liệu vào



///


private void FillDirectoryTree(TreeView tvw,

bool isSource)

{

// trước khi đẩy dữ liệu vào cây, ta phải

xóa bỏ các nút

// hiện đang tồn tại trên cây.

tvw.Nodes.Clear( );

// lấy về danh sách các ổ đĩa logic trên

máy tính

// sau đó đẩy chúng vào làm nút gốc của cây

string[] strDrives =

Environment.GetLogicalDrives( );

// Duyệt qua các ổ đĩa, dùng khối try/catch

để bắt bất

// kỳ lỗi nào xảy ra trên đĩa, nếu đĩa hợp

lệ thì ta

// thêm vào làm nút gốc cho cây.

// đĩa không hợp lệ sẽ không thêm vào cây :

đĩa mềm hay

// CD trống ...



171



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



foreach (string rootDirectoryName in

strDrives)

{

if (rootDirectoryName != @"C:\")

continue;

try

{

// nếu đĩa không hợp lệ ta sẽ quăng ra

một lỗi.

DirectoryInfo dir =

new DirectoryInfo(rootDirectoryName);

dir.GetDirectories( );

TreeNode ndRoot = new

TreeNode(rootDirectoryName);

// thêm nút gốc vào cây

tvw.Nodes.Add(ndRoot);

// thêm các nút con vào cây, nếu là cây

bên trái



// thì thêm cả tập tin vào cây



if (isSource)

GetSubDirectoryNodes(ndRoot,

ndRoot.Text, true);

else

GetSubDirectoryNodes(ndRoot,

ndRoot.Text, false);

}

catch (Exception e)

{

// thông báo đĩa có lỗi

MessageBox.Show(e.Message);

}

}

} // kết thúc thao tác đẩy dữ liệu vào cây

///

///

truyền

///





lấy về tất cả các thư mục con của nút cha

vào,

thêm các thư mục con tìm được vào cây



172



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



/// hàm này có 3 đối số : nút cha, tên đầy đủ

của nút cha,

/// và biến cờ getFileNames xác

định có lấy tập tin không

///


private void GetSubDirectoryNodes(

TreeNode parentNode,

string fullName, bool

getFileNames)

{

DirectoryInfo dir = new

DirectoryInfo(fullName);

DirectoryInfo[] dirSubs =

dir.GetDirectories( );

// ứng với mỗi mục con ta thêm vào cây nếu

nó không ở

// trạng thái ẩn.

foreach (DirectoryInfo dirSub in dirSubs)

{

// bỏ qua các thư mục ẩn

if ( (dirSub.Attributes &

FileAttributes.Hidden) != 0 )

{

continue;

}

///

/// ta chỉ cần tên nút để thêm vào cây,

còn ta phải

/// truyền vào tên

đường dẫn đầy đủ của nút trên cây

/// cho hàm lặp đệ qui

GetSubDirectoryNodes()để nó có

/// thể tìm được các nút con cửa nút đó

///


TreeNode subNode = new

TreeNode(dirSub.Name);

parentNode.Nodes.Add(subNode);

// lặp đệ qui hàm GetSubDirectoryNodes().

GetSubDirectoryNodes(

subNode,dirSub.FullName,getFileNames);



173



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



}

if (getFileNames)

{

// lấy mọi tập tin thuộc nút

FileInfo[] files = dir.GetFiles( );

// thêm các tập tin và nút con

foreach (FileInfo file in files)

{

TreeNode fileNode = new

TreeNode(file.Name);

parentNode.Nodes.Add(fileNode);

}

}

}

///

/// điểm vào chính của ứng dụng.

///


[STAThread]

static void Main( )

{

Application.Run(new Form1( ));

}

///

/// tạo ra một danh sách có thứ tự các tập

tin được chọn ,

/// chép chúng sang cây

bên phải

///


private void btnCopy_Click(object sender,

System.EventArgs e)

{

// lấy về danh sách tập tin

ArrayList fileList = GetFileList( );

// tiến hành chép tấp tin

foreach (FileInfo file in fileList)

{

try

{



174



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



lblStatus.Text = "Copying " +

txtTargetDir.Text +

"\\" + file.Name + "...";

Application.DoEvents( );

file.CopyTo(txtTargetDir.Text + "\\" +

file.Name,chkOverwrite.Checked);

}

catch // (ta không làm gì ở đây cả)

{

}

}

lblStatus.Text = "Done.";

Application.DoEvents( );

}

///

/// bắt sự kiện kết thúc ứng dụng

///


private void btnCancel_Click(object sender,

System.EventArgs e)

{

Application.Exit( );

}

///

/// bắt sự kiện xóa bỏ các nút được chọn trên

cây bên trái

///


private void btnClear_Click( object sender,

System.EventArgs e)

{

// lấy về nút gốc trên cây bên trái và

// tiến hành lặp đệ qui

foreach (TreeNode node in tvwSource.Nodes)

{

SetCheck(node, false);

}

}

///

/// đảm bảo người dùng muốn xóa nút đó



175



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



///


private void btnDelete_Click(object sender,

System.EventArgs e)

{

// xác nhận xóa

System.Windows.Forms.DialogResult result =

MessageBox.Show(

"Are you quite sure?", // thông điệp

"Delete Files", // tiêu đề

MessageBox.Buttons.OKCancel, // nút

nhấn

MessageBox.Icon.Exclamation, // biểu

tượng

MessageBoxDefaultButton.Button2); //

nút mặc định

// nếu đồng ý xóa

if (result ==

System.Windows.Forms.DialogResult.OK)

{

// duyệt danh sách các tập tin và xoá các

tập tin

/ được chọn

ArrayList fileNames = GetFileList( );

foreach (FileInfo file in fileNames)

{

try

{

// cập nhật nhãn

lblStatus.Text = "Deleting " +

txtTargetDir.Text + "\\" + file.Name +

"...";

Application.DoEvents( );

file.Delete( );

}

catch (Exception ex)

{

// hộp thoại thông báo

MessageBox.Show(ex.Message);

}



176



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



}

lblStatus.Text = "Done.";

Application.DoEvents( );

}



}



///

/// lấy đường dẫn đầy đủ của nút được chọn và

gán vào

/// điều khiển TextBox txtTargetDir

///


private void tvwTargetDir_AfterSelect( object

sender,

System.Windows.Forms.TreeViewEventArgs

e)

{

// lấy đường dẫn đầy đủ của nút

string theFullPath =

GetParentString(e.Node);

// nếu nó không là nút lá, ta sẽ xóa 2 ký

tự cuối cùng

// đi, vì đây là dấu //

if (theFullPath.EndsWith("\\"))

{

theFullPath =

theFullPath.Substring(0,theFullPath.Length-1);

}



}



// gán đường dẫn cho điều khiển TextBox

txtTargetDir.Text = theFullPath;



///

/// đánh dấu chọn nút hiện hành và các nút

con của nó

///


private void tvwSource_AfterCheck(object

sender,

System.Windows.Forms.TreeViewEventArgs e)



177



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



{

}



SetCheck(e.Node,e.Node.Checked);



///

/// lập đệ qui việc đánh dấu chọn hay loại bỏ

dấu chọn trên

/// nút truền vào dựa vào cờ check

///


private void SetCheck(TreeNode node, bool

check)

{

// set this node's check mark

node.Checked = check;

// tìm tất cả các nút con của nút

foreach (TreeNode n in node.Nodes)

{

// nếu là nút là thì ta đánh dấu chọn hoặc

không chọn

if (node.Nodes.Count == 0)

node.Checked = check;

// nếu không là lá thì ta lặp đệ qui

else

SetCheck(n,check);

}

}

// lấy về tất cả các tập tin đã được đánh dấu

chọn thuộc

// nút

private void GetCheckedFiles(TreeNode

node,ArrayList fileNames)

{

// nếu là nút lá

if (node.Nodes.Count == 0)

{

// nếu nút là đánh dấu chọn

if (node.Checked)

{

// lấy đường dẫn đầy đủ của nút và thêm

vào cây



178



Xem Thêm
Tải bản đầy đủ (.doc) (369 trang)

×