一段可以在UNIX下,读取当前目录下所有文件(包括子目录中的文件)的文件名的程序

王朝system·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

#include<unistd.h>

#include<dirent.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

char** list(char* dir,int* len)

{

struct dirent** namelist;

char **ret=NULL,**sret=NULL;

int n,rindex,lindex; //index of ret and index of namelist

struct stat buf;

int slen=0; //store the number of files in the sub-directory

char path[1024];

int i;

n = scandir(dir, &namelist, 0, alphasort); //number of items in namelist

if (n < 0)

printf("scandir failed\n");

else

{

n-=2; //ignore dot and dot-dot

if(n<=0)

{

*len=0;

return ret;

}

rindex=n-1;

lindex=n+1;

n+=2;

*len=rindex+1;

ret=(char**)malloc((*len)*sizeof(char*));

for(;rindex>=0;lindex--)

{

if(strcmp(namelist[lindex]->d_name,".")==0 || strcmp(namelist[lindex]->d_name,"..")==0)

{

continue;

}

sprintf(path,"%s/%s",dir,namelist[lindex]->d_name);

// printf("%s\n",path);

if(stat(path,&buf)<0)

{

printf("failed to acquire the state of the file.\n");

exit(1);

}

if(S_ISDIR(buf.st_mode))

{

ret[rindex]=strdup("");

rindex--;

sret=list(path,&slen);

ret=(char**)realloc(ret,(*len+slen)*sizeof(char*));

for(i=0;i<slen;i++)

{

ret[*len]=sret[i];

(*len)++;

}

free(sret);

}

else

{

ret[rindex]=strdup(namelist[lindex]->d_name);

rindex--;

}

}

while(n--) //frees memory blocks

{

free(namelist[n]);

}

free(namelist);

return ret;

}

return ret;

}

int ccmp(char** a,char** b)

{

return strcmp(*a,*b);

}

int main()

{

int len=0; //sum of file names

char **fnames;

fnames=list(".",&len);

printf("-------------------------------\nlistn: %d\n-------------------------------\n",len);

qsort(fnames,len,sizeof(char*),ccmp); //给文件名按字母排序

while(len--) //free all allocated memory blocks

{

printf("%s\n",fnames[len]);

free(fnames[len]);

}

free(fnames);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航