国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

通用子目錄文件顯示方法

2019-11-17 05:31:46
字體:
來源:轉載
供稿:網友

  在用 CHKDS/V 對磁盤子目錄及子目錄文件進行查找時,由于輸出顯示信息沒有分屏顯示,很輕易錯過需要的信息,并且顯示信息沒有標記出隱藏的子目錄名及子目錄文件名,這樣就
對進一步的子目錄及文件操作帶來許多不便。若輔以管道操作采用CHKDSK/V:MORE,雖然可
分屏顯示,但等待輸出時間過長,而且這時 ^_Break 中斷被封鎖,效果不盡人意。本文針對于
此采用截獲 ^_Break 和分屏緩沖輸出技術實現子目錄和子目錄文件及其屬性的顯示。

一、實現原理
子目錄和子目錄文件的查找是通過 C 語言函數 findfirst 和 findnext 采用遞歸算法實現
的。
子目錄和子目錄文件的屬性是根據屬性字來判定。屬性字格式如下圖所示:
-----------------
76543210
-----------------
第 0 位(只讀位):取 1 表示只讀
第 1 位(隱含位):取 1 表示隱含
第 2 位(系統位):取 1 表示系統
第 3 位(卷標位):取 1 表示卷標
第 4 位(子目錄位):取 1 表示子目錄
第 5 位(歸檔位):取 1 表示歸檔
第 6、7 位:保留未用
在子目錄及子目錄文件查找的遞歸調用前,保存 ^_Break 標記并封鎖 ^_Break 中斷,在正
常結束或截獲 ^_Break 中斷(或 ESC 信號)后恢復 ^_Break 標記,并恢復指定驅動器的當前子目
錄、當前驅動器以及當前驅動器的當前子目錄。
在子目錄和子目錄文件的分屏緩沖輸出顯示方面,建立一輸出緩沖區 BUFFER[80*25] 來
完成結果信息的分屏緩沖輸出。

二、程序功能
本程序功能有分屏顯示指定驅動器(缺省時為當前驅動器)、指定目錄(缺省時為當時目
錄)中的指定文件(缺省時為*.*)及其所包含的子目錄和子目錄中的指定文件(缺省時為*.*
)。對于子目錄顯示其子目錄名及其屬性,對于文件顯示匹配的文件名、長度、建立時間及
屬性,最后輸出匹配的文件個數及所包含的子目錄個數。在查找過程中可按 ^_Break 或 ESC 鍵
退出并返回當前驅動器及其當前目錄,若指定驅動器不是當前驅動器則恢復指定驅動器的
當前目錄。
下面舉例說明隱藏子目錄的查找。
假定在驅動器 A 上建立子目錄 TEMP,用 PCTOOLS 或 NORTON 工具軟件將其屬性由 10 改為 FF
。這樣在 DOS 狀態下鍵入 CD TEMP,系統會提示出錯。
作用 CHKDSK A:,系統提示:
Cannot CHDIR to A:/TEMP,
tree past this point not PRocessed
使用本程序,運行結果認為TEMP為一文件,其屬性為 HSRALD,表示這是一個子目錄,可據
此推猜其為一加密子目錄,可進一步用 NORTON 工具軟件解密。

三、實現實例
實例是在 386 兼容機、BORLAND C++3.1集成環境和 DOS 6.0 操作系統支持下調試通過,實
現源程序附后。
需要指出的不足是,由于 findfirst 與 findnext 是通過查找目錄項區實現其功能的,所以
對一些與 FAT 表不符的隱藏文件及子目錄的方法本程序不能奏效,建議結合 CHKDSK 使用本程
序。
另外,本文采用的封鎖 ^_Break 的方法適用于查找過程,但在屏幕輸出過程中不能做到
封鎖 ^_Break 中斷。若需在查、屏幕輸出過程中均封鎖 ^_Break 中斷,可采用 ctrbrk 函數另建
一個 ^_Break 中斷服務程序。
#include
#include
#include
#include
#include
#include
#include
#define ESC 27
#define Ctrl_Break 3
#define PAGE_NUMBER 22
void dir Operate (void);
void add_attrib(strUCt ffblk);
void full_screen_operate(void);
char driver [MAXDRIVE]="",dir [MAXDIR]="";
char file [MAXFILE]="",ext[MAXEXT]=""
char curdriver,curdir [MAXDIR];
char olddriver,olddir[MAXDIR],workdir[MAXDIR];
char FN[13]="*.*";

int page_sum=0,dir_sum=0,file_sum=0;
char buffer[80*25];
char *buffer_pointer=buffer;
char Ctrl_Bresk_flag;
char attrib[7]="";
main(int argc,char * argv[])
{
curdriver=getdisk();
getcwd(curdir,MAXDIR);
driver[0]=curdriver+`A';
if(argc>2){
printf("Too much parameters!/n");
exit(0)
}
if(argc==2){
fnsplit(argv)[1],driver,dir,file,ext);
if(strcpy(file)!=0){
strcpy(file,exr,13);
strcpy(FN file);
};
if(strlen(driver)!=0){
setdisk(toupper(driver[0])-`A')
setdisk(toupper(drive[0])-`A')
getcwd(olddir,MAXDIR);
strcpy(workdir,dirver);
if(strlen(dir)!=0)
if(strlen(dir)==1)
strcat(workdir,dir,strlen(dir));
else
strncat(workdir,dir,strlen(dir)-1);
chdir(workdir);
};
}
Ctrl_Break_flag=getcbrk();
setcbrk(0);
dir_operate()
pust(buffer);
setcbrrk(Ctrl_Break_flag);
if(dir_sum-1==0)
printf("No sub_Directories./n")
else
printf("%d directories./n",dir_sum-1)
if(file_sum==0)
printf("No files./n")
else
printf("%d files./n",file_sum);
if(strlen(driver)!=0){
chdir(olddir);
};
setdisk(curdriver);
chdir(curdir);
return(0);
}
void dir_operate(void)
{
struct ffblk dirment;
int done,p,byte_num;
unsigned int year,month,date,hour minute;
char path[MAXDIR];
/*begin to search all possible files*/
done=findfirst(FN,&dirment,0x2f);
getcwd(path,MAXPATH);
dir_sum++;
page_sum++;
if(page_sum>=PAGE_NUMBER)
full_screen_operate();
/*write Directory name and its attribute into buffer*/
byte_num=sprintf(buffer_pointer,"Directory %s",path);
buffer_poiner+=byte_unm;
byte_unm=sprintf(buffer_pointer,"%6s/n",attrib);
buffer_pointer+=byte_num;
while(!done)
{
page_sum++;
file_sum++;
if(page_sum>=PAGE_NUMBER)
full_screen_operate();
/*write filename and its length,time,attribute into buffer*/
bytp_num=sprintf(buffer_pointer,"%20s%
8ld", dor,emt.ff_name,dirment.ff_fsize);
buffer_pointer+=byte_num;
year=(dirment.ff_fdate>>9 &0x7f)+80;
month=dirment.ff_fdate>>5 &0xf;
date=dirment.ff_fdate &0x1f;
hour=dirment.ff_ftime>>11 & 0x1f;
minute=dirment.ff_ftime>>5 & 0x3f;

byte_num=sprintf(bufferr_Pointer,"%2d-%
02d-%2d",month,date,year);
buffer_pointer+=byte_num;
if(hour>=12){
byte_num=sprintf(buffer_pointer,"%2d:%02dp",hour-12,minute);
buffer_pointer+=byte_num;
}
else{
byte_num=sprintf(buffer_pointer,"%2d:%2da",hour minute);
buffer_pointer+=byte_num;
}
add_attrib(dirment);
byte_num_sprintf(buffer_pointer,"%6s /n",attrib);
buffer_pointer+=byte_num;
/*continue to search*/
done-findnext(&dirment);
};
/*begin to search all possible Directories*/
p=findfirst("*.*",&dirment,0x37);
/*skip Directories.and..*/
if(!p &&dirment.ff_name[0]==`.')
{
p=findnext(&dirment);
p=findnext(&dirment);
}
while(!p)
{ /* if it is directory,then operateit*/
if((-chmod(dirment.ff_name,0))&FA_DIREC)
{
chdir(dirment.ff_name);
add_attrib(dirment);
/*skip Directories.and..*/
dir_operate();
chdir("..");
}
/*continue to search*/
p=findnext(&dirment);
}
}
void add_attrib(struct ffblk dirment)
/*calculate attribute of the given file/directory*/
{
if (dirment.ff_attrib & FA_HIDDEN)
attrib[0]=`H';
else
attrib[0]`.';
if(dirment.ff_attrib & FA_SYSTEM)
attrib[1]=`S';
else
attrib[1]=`.'
if(dirment.ff_attrib & FA_RDONLY)
attrib[2]=`R';
else
attrib[2]=".";
if(dirment.ff_attrib & FA_ARCH)
attrib[3]=`A';
else
attrib[3]=`.';
if(dirment.ff_attrib & FA_LABEL)
attrib[4]=`L';
else
attrib[4]=`.';
if(dirment.ff_attrib &FA_DIREC)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 土默特右旗| 泰顺县| 津市市| 务川| 丽江市| 榆中县| 福海县| 南投县| 宜君县| 重庆市| 榆林市| 准格尔旗| 榕江县| 中阳县| 新乡县| 阳新县| 乡城县| 景洪市| 尼玛县| 镇原县| 电白县| 宁海县| 鄢陵县| 浑源县| 淳化县| 顺平县| 洪湖市| 江门市| 定州市| 柞水县| 厦门市| 黔江区| 广宁县| 富阳市| 宿迁市| 托克托县| 曲麻莱县| 剑阁县| 荔波县| 出国| 穆棱市|