HUNGMANH.CƠM.CANH

Tik Tik Tak

ban la mot nguoi` me game hay~ vao` day

Thông tin cá nhân

domanhls
Sinh nhật: 25 Tháng 5 - 1989
Nơi ở: thanh pho lang son
Yahoo: manh_latao_11141176  
Trạng thái: User is offline (Vắng mặt)
Thêm vào nhóm bạn bè
Gửi tin nhắn

CHU Y
hay cam tai nghe len va ta cung nghe nhac nao cac ban oi

Các bài viết vào Saturday 29th April 2006

 
Sau một thời gian làm việc liên tục với các trình ứng dụng trên Windows, đến một hôm dùng NC hoặc File Manager xem lại ổ đĩa, bạn sẽ thấy trong thư mục WINDOWS\TEMP (hoặc trong một thư mục khác tuỳ theo lệnh SET TEMP trong tệp AUTOEXEC.BAT của bạn) rất nhiều những tệp có tên lạ, đại loại như ~DFT0608.TMP hay ~MF0E52.TMP. Đó chính là những "rác thải" của Windows. Trong quá trình làm việc, Windows dùng thư mục này để ghi những thông tin tạm thời, rồi vì lý do gì đấy Windows kết thúc mà không kịp xoá đi những mẩu tin vụn vặt này.

Tình hình cũng xảy ra tương tự với các ứng dụng FoxPro, Turbo Pascal. Nếu dùng một trình soạn thảo như MS Word và bật tuỳ chọn Always Create Backup Copy, bạn sẽ còn những tệp thừa mang đuôi .BAK nữa.

Nói chung trong đống rác đôi khi cũng có thể tìm được điều gì hữu ích (ví dụ như khi bạn cần cứu dữ liệu) nhưng đa phần đều không cần thiết. Nếu bạn không để ý thì chỉ sau một thời gian, những tệp rác ấy sẽ sinh sôi khá nhiều, chiếm một phần diện tích và quan trọng hơn, chúng là nguyên nhân gây ra hiện tượng "liên cung lạc" (lost cluster) trên đĩa.

Đó chính là một lý do của sự cần thiết phải có một chương trình dọn dẹp đĩa mà chúng tôi tạm gọi là ZAP (theo tên một lệnh trong FoxPro). Về tổng quát, đây là một chương trình xoá tệp hay nhóm tệp trên toàn đĩa, cho dù chúng ở trong thư mục ngóc ngách nào. Như vậy, việc sử dụng nó cũng phải rất thận trọng để tránh trở thành "con dao hai lưỡi".

Hạt nhân của chương trình này cũng như mọi chương trình đòi hỏi truy nhập mọi cấp thư mục là đoạn chương trình duyệt đĩa sử dụng thủ tục đệ quy Scan_Files. Thủ tục này sẽ duyệt trước hết thư mục xuất phát (nếu bỏ qua tên thư mục trong tham số dòng lệnh thì thư mục xuất phát chính là thư mục hiện thời), nếu tìm thấy tệp được nêu trong tham số dòng lệnh (hoặc tệp phù hợp với các ký tự đại diện * và ? trong tham số dòng lệnh) thì sẽ xoá tệp đó. Sau đó thủ tục sẽ duyệt đến từng thư mục con. Khi vào mỗi thư mục con, do tính chất đệ quy, thư mục con đó lại trở thành thư mục xuất phát. Quá trình cứ thế tiếp diễn với các thư mục cấp dưới hơn.

Nếu thư mục xuất phát là thư mục gốc thì toàn bộ ổ đĩa sẽ bị "rà soát".

Sau khi giải quyết xong vấn đề đệ quy, chũng ta cần quan tâm đến những gì người dùng sẽ đưa vào từ dòng lệnh. Nếu đang ở trong thư mục WINDOWS\TEMP thì câu lệnh

ZAP *.TMP

sẽ xoá tất cả các tệp có đuôi .TMP trong thư mục này và các thư mục con bên dưới. Thế nhưng nếu người dùng muốn xoá các tệp có đuôi .$$$ trong thư mục TP thì sao. Tất nhiên câu lệnh sẽ phải như thế này:

ZAP C:\TP\*.$$$

Thủ tục Path_Split sẽ kiểm tra tham số đưa vào và phân tích đâu là đường dẫn (tức thư mục xuất phát) và đâu là tên tệp (hay nhóm tệp) cần xoá. Đồng thời nó cũng đưa ra một số mặc định giúp người dùng rút ngắn dòng lệnh. Nếu không có tham số, chương trình sẽ hiện ra một số dòng hướng dẫn cú pháp và cách dùng các tham số mặc định.

Ngoài ra, chương trình có sử dụng hàm đổi chữ hoa Upper để tiện đối chiếu với tên tệp trên đĩa.

Các bạn có thể cải tiến thêm chương trình để cùng một lúc xoá được nhiều loại tệp, hoặc đưa câu hỏi yêu cầu người dùng xác nhận lại trước khi xoá, v.v...

Đệ quy là một vấn đề rất lý thú và không thể bỏ qua khi bạn muốn viết các chương trình cần duyệt cây thư mục (như chương trình FindFile chẳng hạn). Trong những số tiếp sau, chúng tôi sẽ giới thiệu những chương trình tương tự dùng thủ tục đệ quy để đặt lại thời gian hay thuộc tính cho các tệp.


--------------------------------------------------------------------------------

PROGRAM Zap; {$I-,S-} {$M 8192,8192,655360}

USES Dos;

VAR FVar : file;
CurrentPath, WorkingPath, SearchMask : pathstr;

CONST FileDeleted : integer = 0;

Function Upper(S: pathstr): pathstr;
Var i : byte;
Begin
for i := 1 to length(S) do S[i] := upcase(S[i]);
Upper := S;
End;

PROCEDURE Path_Split(DirName: pathstr);
Var i, DN : byte;
Begin
if (DirName[2]=':') and (DirName[3]<>'\') then insert('\',DirName,3);

DN := 0;
for i := 1 to length(DirName) do
if DirName[i] = '\' then DN := i;

if DN = 0 then
begin
WorkingPath := CurrentPath;
SearchMask := DirName;
end
else
begin
WorkingPath := copy(DirName,1,DN-1);
SearchMask := copy(DirName,DN+1,length(DirName)-DN);
end;

if WorkingPath[2] <> ':' then WorkingPath := CurrentPath+'\'+WorkingPath;
if WorkingPath[length(WorkingPath)]='\' then dec(WorkingPath[0]);

if SearchMask = '' then SearchMask := '*.BAK';
if pos('.',SearchMask) = 0 then SearchMask := SearchMask+'*.*'
else if SearchMask = '.' then SearchMask := '*.*'
else if SearchMask[1] = '.' then SearchMask := '*'+SearchMask;
End;

PROCEDURE Scan_Files(OrigPath,SearchName: pathstr);
Var F : SearchRec;
SubOrigPath : pathstr;

Begin
findfirst(OrigPath+'\'+SearchName,Anyfile-Directory-VolumeID,F);
while DosError = 0 do
begin
assign(FVar,OrigPath+'\'+F.Name);
erase(FVar);

if IOresult = 0 then
begin
writeln(' ',OrigPath+'\'+F.Name);
inc(FileDeleted);
end
else writeln(' Disk access error ...');

findnext(F);
end;

findfirst(OrigPath+'\*.*',Directory,F);
while DosError = 0 do
begin
if (F.Attr and $10 <> 0) and (F.Name[1] <> '.') then
begin
SubOrigPath := OrigPath+'\'+F.Name;
Scan_Files(SubOrigPath,SearchName);
end;
findnext(F);
end;
End;

BEGIN
writeln('ZAP - PC Master Utilities Pack. Copyright by Thanh Hai.');

if paramCount <> 0 then
begin
getDir(0,CurrentPath);

Path_Split(upper(ParamStr(1)));
Scan_Files(WorkingPath,SearchMask);

if DosError = 3 then writeln('Directory not found - '+WorkingPath)
else
case FileDeleted of
0 : writeln('No matching file detected - '+SearchMask);
1 : writeln('1 file has been deleted.');
else writeln(FileDeleted,' files have been deleted.');
end;
end
else
begin
writeln('Command Use : ZAP [file spec]');
writeln('whereas : [file spec] - name of directory and/or file(s)');
writeln(' wildcards in filename are acceptable');
writeln(' *.BAK at default');
writeln('Example : ZAP a:\program\. means ZAP a:\program\*.*');
writeln(' ZAP program\ means ZAP [current_dir]\program\*.bak');
writeln(' ZAP prog means ZAP [current_dir]\prog*.*');
writeln(' ZAP \.prg means ZAP [current_dir]\*.prg');
writeln(' ZAP program. means ZAP [current_dir]\program');
writeln(' ZAP \ erases all .bak files in all directories on disk');
end;
END.

 

> Trả lời nhanh
Bình luận của bạn sẽ được đăng sau khi chủ blog kiểm duyệt và chấp nhận
Nhập vào tên của bạn:
Nhập mã số xác nhận (bắt buộc):
» Hiển thị cửa sổ mặt cười       » Download bộ gõ tiếng Việt Unikey
 Bạn có muốn chuyển các ký hiệu như :) :( :D ...thành mặt cười trong bài viết này?
 Bạn có muốn chèn thêm chữ ký vào bài viết này ?
 


 
CHBTNSB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31



(♥ Góc Thơ ♥)

Truyện cười

Lượt xem thứ:





Mạng xã hội của người Việt Nam.
VnVista I-Shine © 2005 - 2025   VnVista.com