C语言文件遍历及读写

c语言中遍历文件或者文件夹,系统提供的dirent和DIR结构体中包含了文件的很多信息

struct dirent 结构
struct dirent
{
   long d_ino; /* inode number 索引节点号 */
   off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
   unsigned short d_reclen; /* length of this d_name 文件名长 */
   unsigned char d_type; /* the type of d_name 文件类型 */
   char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}

DIR 结构
struct __dirstream
{
void *__fd; /* `struct hurd_fd‘ pointer for descriptor.   */
char *__data; /* Directory block.   */
int __entry_data; /* Entry number `__data‘ corresponds to.   */
char *__ptr; /* Current pointer into the block.   */
int __entry_ptr; /* Entry number `__ptr‘ corresponds to.   */
size_t __allocation; /* Space allocated for the block.   */
size_t __size; /* Total valid data in the block.   */
__libc_lock_define (, __lock) /* Mutex lock for this structure.   */
};
typedef struct __dirstream DIR;

struct dirent中的几个成员:

d_type:4表示为目录,8表示为文件

d_reclen:16表示子目录或文件,24表示非子目录

经过本人亲自试验发现:d_reclen:16表示子目录或以.开头的隐藏文件,24表示普通文本文件,28为二进制文件,等等

d_name:目录或文件的名称

具体代码如下,仅供参考:

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
void List(char *path)
{
    struct dirent* ent = NULL;
    DIR *pDir;
    pDir=opendir(path);
    while (NULL != (ent=readdir(pDir)))
    {
        if (ent->d_reclen==24)
        {
            if (ent->d_type==8)
            {
                printf("普通文件:%s\n", ent->d_name);
            }
            else
            {
                printf("子目录:%s\n",ent->d_name);
                List(ent->d_name);
                printf("返回%s\n",ent->d_name);
            }
        }
    }
}
int main(int argc, char *argv[])
{
     List(argv[1]);
     return 0;
}
上面函数修改后:
void List(char *path)
{
    printf("路径为[%s]\n", path);

    struct dirent* ent = NULL;
    DIR *pDir;
    pDir=opendir(path);
    //d_reclen:16表示子目录或以.开头的隐藏文件,24表示普通文本文件,28为二进制文件,还有其他……
    while (NULL != (ent=readdir(pDir)))
    {
        printf("reclen=%d    type=%d\t", ent->d_reclen, ent->d_type);
        if (ent->d_reclen==24)
        {
            //d_type:4表示为目录,8表示为文件
            if (ent->d_type==8)
            {
                printf("普通文件[%s]\n", ent->d_name);
            }
        }
        else if(ent->d_reclen==16)
        {
            printf("[.]开头的子目录或隐藏文件[%s]\n",ent->d_name);
        }
        else
        {
            printf("其他文件[%s]\n", ent->d_name);
        }
    }
}

下面是网上找来的几个小例子:

#include   <stdio.h>
#include   <dirent.h>
#include   <sys/types.h>
#include   <sys/stat.h>   

void dir_scan(char   *path,   char   *file);
int count = 0;   

int main(int   argc,   char   *argv[])
{
                  struct   stat   s;   

                  if(argc   !=   2){
                                  printf("one   direction   requried\n");
                                  exit(1);
                  }
                  if(lstat(argv[1],   &s)   <   0){
                                  printf("lstat   error\n");
                                  exit(2);
                  }
                  //判断一个路径是否是目录
                  if(!S_ISDIR(s.st_mode)){
                                  printf("%s   is   not   a   direction   name\n",   argv[1]);
                                  exit(3);
                  }   

                  dir_scan("",   argv[1]);   

                  printf("total:   %d   files\n",   count);   

                  exit(0);
}   

void   dir_scan(char   *path,   char   *file)
{
                  struct   stat   s;
                  DIR           *dir;
                  struct   dirent   *dt;
                  char   dirname[50];   

                  memset(dirname,   0,   50*sizeof(char));
                  strcpy(dirname,   path);   

                  if(lstat(file,   &s)   <   0){
                                  printf("lstat   error\n");
                  }   

                  if(S_ISDIR(s.st_mode)){
                                  strcpy(dirname+strlen(dirname),   file);
                                  strcpy(dirname+strlen(dirname),   "/");
                                  if((dir   =   opendir(file))   ==   NULL){
                                                  printf("opendir   %s/%s   error\n");
                                                  exit(4);
                                  }
                                  if(chdir(file)   <   0)   {
                                                  printf("chdir   error\n");
                                                  exit(5);
                                  }
                                  while((dt   =   readdir(dir))   !=   NULL){
                                                  if(dt->d_name[0]   ==   ‘.‘){
                                                                  continue;
                                                  }   

                                                  dir_scan(dirname,   dt->d_name);
                                  }
                                  if(chdir("..")   <   0){
                                                  printf("chdir   error\n");
                                                  exit(6);
                                  }
                  }else{
                                  printf("%s%s\n",   dirname,   file);
                                  count++;
                  }
}

linux c 下如何获得目录下的文件数目。
int main(int argc, char **argv)
{
     DIR  * pdir;
    struct dirent * pdirent;
    struct stat f_ftime;
    int fcnt;/*文件数目统计*/
     pdir=opendir("./");
    if(pdir==NULL)
    {      return(-1);    }
     fcnt=0;
    for(pdirent=readdir(pdir);pdirent!=NULL;pdirent=readdir(pdir))
    {
      if(strcmp(pdirent->d_name,".")==0||strcmp(pdirent->d_name,"..")==0) continue;

      if(stat(pdirent->d_name,&f_ftime)!=0) return -1 ;
      if(S_ISDIR(f_ftime.st_mode)) continue; /*子目录跳过*/
       fcnt++;
      printf("文件:%s\n",pdirent->d_name);
    }
    printf("文件总数%d\n",fcnt);
     closedir(pdir);
    return 0;
}

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>  

void printdir(char *dir, int depth)
{
         DIR *dp;
         struct dirent *entry;
         struct stat statbuf; 

         if((dp = opendir(dir)) == NULL) {
                     fprintf(stderr, "cannot open directory: %s\n ", dir);
                     return;
         }
         chdir(dir);
         while((entry = readdir(dp)) != NULL) {
                     lstat(entry-> d_name,&statbuf);
                     if(S_ISDIR(statbuf.st_mode)) {
                                 /**//* Found a directory, but ignore . and .. */
                                 if(strcmp( ". ",entry-> d_name) == 0 ||
                                             strcmp( ".. ",entry-> d_name) == 0)
                                             continue;
                                 printf( "%*s%s/\n ",depth, " ",entry-> d_name);
                                 /**//* Recurse at a new indent level */
                                 printdir(entry-> d_name,depth+4);
                     }
                     else printf( "%*s%s\n ",depth, " ",entry-> d_name);
         }
         chdir( ".. ");
         closedir(dp);
} 

/**//*    Now we move onto the main function.    */ 

int main(int argc, char* argv[])
{
         char *topdir, pwd[2]= ". ";
         if (argc != 2)
                     topdir=pwd;
         else
                     topdir=argv[1]; 

         printf( "Directory scan of %s\n ",topdir);
         printdir(topdir,0);
         printf( "done.\n "); 

         exit(0);
}

注:关于文件读取的速度问题

在文件大小相同的前提下:
 1.读刚读过的文件比头次读没读过的文件快
 2.读转速快的硬盘上的文件比读转速慢的硬盘上的文件快
 3.读没有磁盘碎片的文件比读有磁盘碎片的文件快
 4.读文件不处理比边读边处理快
 5.单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上)

6.读固态硬盘上的文件比读普通硬盘上的文件快

顺便提一下在c语言中读写文件:

在C语言中写文件

//获取文件指针
FILE *pFile = fopen("1.txt", //打开文件的名称
                    "w"); // 文件打开方式 如果原来有内容也会销毁
//向文件写数据
fwrite ("hello", //要输入的文字
         1,//文字每一项的大小 以为这里是字符型的 就设置为1 如果是汉字就设置为4
         strlog("hello"), //单元个数 我们也可以直接写5
         pFile //我们刚刚获得到的地址
         );
//fclose(pFile); //告诉系统我们文件写完了数据更新,但是我们要要重新打开才能在写
fflush(pFile); //数据刷新 数据立即更新 

                            

在C语言中读文件

FILE *pFile=fopen("1.txt","r"); //获取文件的指针
char *pBuf;  //定义文件指针
fseek(pFile,0,SEEK_END); //把指针移动到文件的结尾 ,获取文件长度
int len=ftell(pFile); //获取文件长度
pBuf=new char[len+1]; //定义数组长度
rewind(pFile); //把指针移动到文件开头 因为我们一开始把指针移动到结尾,如果不移动回来 会出错
fread(pBuf,1,len,pFile); //读文件
pBuf[len]=0; //把读到的文件最后一位 写为0 要不然系统会一直寻找到0后才结束
MessageBox(pBuf);  //显示读到的数据
fclose(pFile); // 关闭文件
时间: 2024-11-08 21:32:57

C语言文件遍历及读写的相关文章

C语言文件读写操作总结

C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char

Python遍历文件夹和读写文件的方法

本文和大家分享的主要是python开发中遍历文件夹和读写文件的相关内容,一起来看看吧,希望对大家学习和使用这部分内容有所帮助. 需 求 分 析 1.读取指定目录下的所有文件 2.读取指定文件,输出文件内容 3.创建一个文件并保存到指定目录 实 现 过 程 Python写代码简洁高效,实现以上功能仅用了40行左右的代码~ 昨天用Java写了一个写入.创建.复制.重命名文件要将近60行代码: 不过简洁的代价是牺牲了一点点运行速度,但随着硬件性能的提升,运行速度的差异会越来越小,直到人类无法察觉~ #

C语言文件的读写

对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: 字符读写函数  :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式化读写函数:fscanf和fprinf 下面分别予以介绍.使用以上函数都要求包含头文件stdio.h. 字符读写函数fgetc和fputc 字符读写函数是以字符(字节)为单位的读写函数. 每次可从文件读出或向文件写入一个字符. 1) 读字符函数fgetcfgetc函数的功能是从指定的文件中读一个字符

3,C语言文件读写

这两天看到一个关于文件读写的题目,索性就把相关内容总结下. C语言文件读写,无非是几个读写函数的应用,fopen(),fread(),fwrite()等,下面简单介绍下. 一.fopen() 函数原型:FILE *fopen(const char *path, const char *mode); 参数说明:path,所打开的文件名(包含文件路径,缺省值为当前工程目录):mode:流形态,后文详述. 返回值:文件指针.打开失败,返回NULL;打开成功,返回指向该流的文件指针. mode详解:mo

C语言文件读写命令fprintf和fscanf

以向文件中读取和写入二维数组为例. 以下是fprintf的使用:向文件中写入10*10的二维数组,数组元素为1~100之间的随机数. #include <stdlib.h> #include<iostream> using namespace std; int main() { int array[13][13],i,j; FILE *fp = fopen("result.txt", "w"); if(!fp) { printf("

go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 文件操作 func Open(name string) (file *File, err error),*File 是实现了 io.Reader这个接口byte[] 转化为 bytes.Buffer:bytes.NewBuffer([]byte). 一.建立与打开 建立文件函数:func Create(name string) (file *File, err Error)func N

c语言-遍历pci设备(2)mmio访问

前言 今天其实我在公司也没有做什么,但是昨天就把pcie遍历的mmio形式做了出来,赞扬公司的台湾服务器,至少我可以使用google来去搜索我想要的资料和答案,有一位大神在台湾的论坛上发布了一片博文,针对dos环境下的mmio的方法,在国内通过百度等等方法是无法访问到的,当然最让人失望的是,如果我不开代理,直接输入网址也是无法进入的,可能有很多人觉得你遍历pcie干吗?嘿嘿,那就是告诉你如何通过代码去访问我门电脑里面最底层的设备,这是一种极其需要能力的.好了,不扯皮了,小编带你通过c语言与汇编的

12. Go 语言文件处理

Go 语言文件处理 本章我们将带领大家深入了解一下 Go语言中的文件处理,重点在于文件而非目录或者通用的文件系统,特别是如何读写标准格式(如 XML 和 JSON 格式)的文件以及自定义的纯文本和二进制格式文件. 由于前面的内容已覆盖 Go语言的所有特性,现在我们可以灵活地使用 Go语言提供的所有工具.我们会充分利用这种灵活性并利用闭包来避免重复性的代码,同时在某些情况下充分利用 Go语言对面向对象的支持,特别是对为函数添加方法的支持. Go语言自定义数据文件 对一个程序非常普遍的需求包括维护内

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others