Thứ tư, ngày 7 tháng 12 năm 2016

C# – Y2 Visual CD – Tạo và lưu trữ chỉ mục ổ đĩa

Ngày đăng: 9/3/2012, 15:18:10PM | Lượt xem: 1,608
Hot!

Lâu rồi bây giờ mới có thời gian rảnh học những thứ mình muốn. Tạm khai trương lại blog bằng 1 project cũ.

Lâu rồi bây giờ mới có thời gian rảnh học những thứ mình muốn. Tạm khai trương lại blog bằng 1 project cũ.

Project Visual CD này làm từ tháng 8/2009 và bỏ dở chưa hoàn thành nên nhiều chức năng chưa hoàn chỉnh. Xin post mã nguồn lên đây hi vọng có bạn nào thấy hứng thú có thể tiếp tục làm hoặc góp vài ý tưởng để làm project tốt hơn.

 


Tạm trích dẫn đoạn giới thiệu về Visual CD trên mạng:

[...]

Thử tượng tượng bạn có nguồn dữ liệu gồm nhiều thể loại là phần mềm, file video, file nhạc, hình ảnh, ebook, tài liệu…, bạn đã chép chúng lên đĩa CD, DVD để lưu trữ. Bây giờ, bạn muốn sử dụng nguồn dữ liệu đó, cần đọc một tài liệu chuyên ngành chẳng hạn, nhưng lại không nhớ đã để tài liệu này trên đĩa CD nào. Khi đó, bạn chỉ có cách đưa từng đĩa vào để kiểm tra. Với số lượng đĩa lớn thì đây không phải là cách hay. Nếu bạn là người cẩn thận, đã chép đĩa theo từng nhóm chủ đề và ghi chú lên bìa đĩa thì cũng không thể mô tả tường tận mọi nội dung trong đĩa. Việc quản lý dữ liệu trên các thiết bị lưu trữ dường như không phải chuyện đơn giản, nhất là với nguồn dữ liệu lớn và số lượng đĩa nhiều.

Visual CD là ứng dụng giúp giải quyết vấn đề trên. Visual CD ghi nhớ mọi nội dung có trên đĩa CD, DVD…, giúp bạn dễ dàng và nhanh chóng tìm kiếm thông tin và nơi lưu trữ dữ liệu cần thiết. Hơn nữa, công việc nạp thông tin cho Visual CD được tiến hành tự động, bạn không phải tốn nhiều công sức.

[...]

Y2 Visual CD

Y2 Visual CD

Phương pháp làm cũng đơn giản, chỉ cần đệ quy duyệt tất cả thư mục và file của ổ đĩa và lưu nó lại trong 1 collection như 1 ổ đĩa duy nhất. Cuối cùng dùng serialization “ổ đĩa” này xuống file theo dạng nhị phân. Lúc nạp lên thì chỉ cần đọc file và gán vào đối tượng “ổ đĩa” và công việc còn lại là hiển thị lên form sao cho đẹp mắt.

Cách thực hiện này ưu điểm là dễ dàng và nhanh chóng nhưng bù lại kích thước file tạo ra lại khá lớn, trong khi hàng “thật” chỉ có mấy trăm KB 1 file thì hàng “dỏm” lên đến mấy MB, đây cũng là lí do chính khiến tôi dừng project này. Nếu như sử dụng cấu trúc dữ liệu khác và lưu theo định dạng khác thì sẽ nhẹ hơn nhưng lại phức tạp và tôi chưa tìm được cách nào hiệu quả nhất.

Chi tiết hơn, tôi tạo ra 3 class đại diện cho mỗi cấp để lưu trữ là: file, folder và disk. Mã nguồn của 3 lớp như sau:

VisualFile.cs:

[Serializable]

class VisualFile

{

public string Name;

public long Size;

public DateTime DateModify;

public VisualFile()

{}

public VisualFile(string name):this()

{

this.Name=name;

}

public override string ToString()

{

return this.Name;

}

}

VisualFolder.cs:

[Serializable]

internal class VisualFolder

{

public SortedList<string,VisualFile> listFile;

public SortedList<string, VisualFolder> listFolder;

public string Name;

public DateTime DateModify;

public VisualFolder()

{

listFile = new SortedList<string, VisualFile>();

listFolder = new SortedList<string, VisualFolder>();

}

public VisualFolder(string name):this()

{

this.Name=name;

}

protected virtual void SnapDirectory(string path)

{

if (!Directory.Exists(path))

return;

foreach (string file in Directory.GetFiles(path))

{

FileInfo fInfo = new FileInfo(file);

VisualFile vFile = new VisualFile();

vFile.Name = fInfo.Name;

vFile.Size = fInfo.Length;

vFile.DateModify = fInfo.LastWriteTime;

listFile.Add(vFile.Name, vFile);

}

foreach (string dir in Directory.GetDirectories(path))

{

DirectoryInfo dInfo = new DirectoryInfo(dir);

VisualFolder folder = new VisualFolder(Path.GetFileName(dir));

try

{

folder.DateModify = dInfo.LastWriteTime;

}

catch { }

listFolder.Add(folder.Name, folder);

folder.SnapDirectory(dir);

}

}

public VisualFolder GetSubFolder(string name)

{

if (!listFolder.ContainsKey(name))

return null;

VisualFolder folder;

if (listFolder.TryGetValue(name, out folder))

return folder;

return null;

}

public bool HasSubFolder

{

get { return listFolder.Count > 0; }

}

public override string ToString()

{

return this.Name;

}

}

VisualDisk.cs:

[Serializable]

internal class VisualDisk:VisualFolder

{

public string Label;

public string Description;

public VisualDisk(string label)

{

this.Label = label;

}

public VisualDisk(string label, string description)

: this(label)

{

this.Description = description;

}

public void SnapDisk(string path)

{

base.SnapDirectory(path);

}

public VisualFolder GetFolder(string path)

{

string[] dirs = path.Split(Path.DirectorySeparatorChar);

VisualFolder folder=this;

for(int i=1;i<dirs.Length;i++)

{

folder = folder.GetSubFolder(dirs[i]);

if (folder == null)

break;

}

return folder;

}

public override bool  Equals(object obj)

{

VisualDisk disk = obj as VisualDisk;

if (disk == null)

return false;

return String.Compare(this.Label,disk.Label)==0;

}

}

Bạn có thể thấy cách thức làm việc của chương trình rất rõ ràng. Đầu tiên ta tạo 1 đối tượng VisualDisk (kế thừa từ VisualFolder) mới và truyền cho nó đường dẫn của ổ đĩa cần lưu lại chỉ mục. ĐỐi tượng “ổ đĩa” này sẽ dùng phương thức SnapDisk để bắt đầu tạo ra 1 “ổ đĩa” phân cấp hoàn chỉnh như dạng cây. Phương thức SnapDisk thực ra chỉ gọi lại phương thức SnapDirectory của lớp VisualFolder. Phương thức SnapDirectory sẽ quét và tạo ra các đối tượng VisualFile và VisualFolder con của nó để add vào 2 collection riêng biệt cho file và folder.

Download(716KB)

http://yinyangit.wordpress.com

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.