怎么用C语言遍历文件啊?
#include stdio.h #include dos.h #include errno.h #include io.h #include dirent.h #include dir.h #include string.h #include sys\stat.h #include “pm03a.h” void main(int argc,char* argv[]) { //printf(“Number %d\n”,ConfirmFileAttrib(argv[1])); GetDirectory(argv[1]); printf(“\nSearch Over.\n”); } //—————————————————————— //pm03a.h //—————————————————————— void GetDirectory(char *DirectoryName); int ConfirmFileAttrib(char* filename); char *GetCurrentPath(); char* GetFullFileName(char *filename); char *WillDeleteFile(char *FileName); //——————————————————– //————— 获得文件属性 ————————— //——————————————————– int ConfirmFileAttrib(char* filename) { int temp=0; int attrib=(_rtl_chmod(filename,0)); if(attrib==-1) { switch(errno) { case ENOENT: //printf(“%s Path or file not found.\n”,filename); temp=0; break; case EACCES: //printf(“Permission denied.\n”); temp=-1; break; default: //printf(“Error number: %d”, errno); temp=-2; break; } } else { if(attrib FA_RDONLY) { temp=1; //printf(“%s is read-only.\n”, filename); } if(attrib FA_HIDDEN) { temp=2; //printf(“%s is hidden.\n”, filename); } if(attrib FA_SYSTEM) { temp=3; //printf(“%s is a system file.\n”, filename); } if(attrib FA_DIREC) { temp=4; //printf(“%s is a directory.\n”, filename); } if (attrib FA_ARCH) { temp=5; //printf(“%s is an archive file.\n”, filename); } } return temp; } //——————————————————– //——————————————————– //————— 获取目录流 —————————– //——————————————————– void GetDirectory(char *DirectoryName) { DIR* Directory_Point; struct dirent *entry; bool DirControl; if((Directory_Point=opendir(DirectoryName))==NULL) { printf(“Error opening directory!\n”); return; } else { if(strcmp(DirectoryName,”..”)==0) { return; } if(strcmp(DirectoryName,”.”)==0) DirControl=true; else DirControl=false; chdir(DirectoryName); //char *filename=DirectoryName; //int k=creat(strcat(filename,”.txt”),S_IWRITE); while(bool(entry=readdir(Directory_Point))) { if(ConfirmFileAttrib(entry-d_name)==5) // 确定为文件属性 { // 文件过滤 WillDeleteFile(entry-d_name); } if(ConfirmFileAttrib(entry-d_name)==4) // 确定为目录属性 { if(strcmpi(entry-d_name,”..”)==0||strcmpi(entry-d_name,”.”)==0) { continue; } else { //printf(“\n%s is direct\n\n”,entry-d_name); GetDirectory(entry-d_name); } } } if(!DirControl==true) chdir(“..”); closedir(Directory_Point); } } //——————————————————– //——————————————————– //———- 判断文件类型以备过滤 ———————— //——————————————————– char* GetFullFileName(char *filename) { char *FullFilename=GetCurrentPath(); if(strlen(FullFilename)=3) { strcat(FullFilename,filename); } else { strcat(FullFilename,”\\”); strcat(FullFilename,filename); } return FullFilename; } char *GetCurrentPath() { char path[1024]=””; strcpy(path, “X:\\”); /* fill string with form of response: X:\ */ path[0] = ‘A’ + getdisk(); /* replace X with current drive letter */ getcurdir(0, path+3); /* fill rest of string with current directory */ return path; } char *WillDeleteFile(char *FileName) { int len; for(len=strlen(FileName);len=0;len–) { if(FileName[len]==’.’) break; } char* Retname; int s=-1; for(int i=len;i=strlen(FileName);i++) { Retname[s+=1]=FileName[i]; } int i=-1; if(Retname[1]==’~’)i=0; if(strcmpi(Retname,”.bak”)==0)i=0; if(strcmpi(Retname,”.obj”)==0)i=0; if(strcmpi(Retname,”.tds”)==0)i=0; if(strcmpi(Retname,”.dcu”)==0)i=0; if(strcmpi(Retname,”.tmp”)==0)i=0; if(strcmpi(Retname,”.ilk”)==0)i=0; if(strcmpi(Retname,”.pch”)==0)i=0; if(strcmpi(Retname,”.pdb”)==0)i=0; if(strcmpi(Retname,”.tlb”)==0)i=0; if(strcmpi(Retname,”.idb”)==0)i=0; if(strcmpi(Retname,”.pdb”)==0)i=0; if(strcmpi(Retname,”.r$p”)==0)i=0; if(strcmpi(Retname,”.OBR”)==0)i=0; if(strcmpi(Retname,”.mbt”)==0)i=0; if(strcmpi(Retname,”.mrt”)==0)i=0; if(strcmpi(Retname,”.csm”)==0)i=0; if(i==0) { remove(GetFullFileName(FileName)); printf(“%s delete\n”,GetFullFileName(FileName)); } return Retname; }
windows下用C语言实现遍历C盘下所有.exe文件,并将文件路径与文件名一行一行输出到TXT文件中
我来写个autoit 脚本吧 (autoit 3.3.6.1 汉化版 winxp home sp3 环境 编译运行通过) 来个效果图 一下是源代码 $dir = “D:\h” ;需要查找的路径 $str = search($dir) ;调用search函数查找路径 $arr = StringSplit($str, “|”) ;将search函数返回的字符串拆分成数组,数组元素就是一个文件的完整路径 $file = $arr ;把数组arr复制给file使file成为和arr相同大小的数组,目的只是为了构造相同大小的数组 $j = 1 ;循环把 数组arr中 For $i = 1 To $arr[0] $p = StringInStr($arr[$i], “\”, 0, -1) ;从路径尾部向前找到路径分割符”\”在字符串中的位置 $filename = StringMid($arr[$i], $p+1) ;截取文件名 ;如果文件名中包含字符串FRA,则将其复制到数组file中 If StringInStr($filename, “FRA”, 0) Then $file[$j] = $arr[$i] $j += 1 EndIf Next $n = $j – 1 ;循环结束后j-1的值就是含FRA的文件的个数 ;buf字符串的内容将会用来写入文件 $buf = “总共找到文件个数:” $n ” 个” @CRLF ;循环将数组file中的路径拼接到buf上 For $j = 1 To $n $buf = $file[$j] @CRLF Next ;在脚本所在目录创建统计报告.txt $fp = FileOpen(@ScriptDir “\统计报告.txt”, 10) FileWrite($fp, $buf) ;把buf的内容写入统计报告.txt FileClose($fp) ;关闭fileopen函数打开的文件 Run(@WindowsDir “\Notepad.exe ” @ScriptDir “\统计报告.txt”, “”);用启动记事本打开生成的文件 ;递归查找函数,递归查找*.*,支持子目录,以字符串形式返回所有文件的路径 ;各路径之间用 竖线“|”隔开 Func search($path) $ret = “” $handle = FileFindFirstFile($path “\*.*”) If $handle = -1 Then Return $ret While 1 $file = FileFindNextFile($handle) If @error Then ExitLoop If @extended Then $tmp = search($path “\” $file) Else $tmp = $path “\” $file EndIf If $tmp “” Then If $ret = “” Then $ret = $tmp Else $ret = $ret “|” $tmp EndIf EndIf WEnd Return $ret EndFunc
请问如何用c语言实现遍历查找磁盘下的exe文件? 我是在VC6.0平台下
调用DOS 命令 dir 就可以了。
如果只要显示文件名,加 选项 /B
如果要显示所有子文件夹里的文件名, 加 选项 /S
例如 DIR C:\*.exe /B /S
如果要把显示 转向到文件 DIR C:\*.exe /B /S abc.lis
DOS 命令 可以用 sprintf 做成,用 system() 让它执行。
程序如下:
#include stdio.h
#include stdlib.h
main(){
char cmd[80];
char d;
for (d=’C’;d=’Z’;d++) // 对 磁盘号 C: D: E: …..Z: 循环
{
sprintf(cmd,”DIR %c:\\*.exe /B”,d); // 命令
// printf(“%s\n”,cmd); // 检查 命令字符串 是否正确
system(cmd); // 执行
}
return 0;
}
在c语言中,如何将exe文件的内容读出
简单的读出吗?
如果是的话 可以用fopen fgets 等等这些函数
但是你想有格式地读出 你就必须去学PE文件结构 这样就可以修改exe里面的内容,包括执行的代码 嘿嘿 写病毒可是就要学的啊