您当前的位置:首页 > 计算机 > 编程开发 > C语言

怎样用C语言对某个目录下的文件名进行排序?

时间:12-30来源:作者:点击数:

在4.8的例子中,用_dos_findfirst()和_dos_findnext()函数遍历目录结构,每找到一个文件名,就把它打印在屏幕上,因此,文件名是逐个被找到并列出来的。

当你对某个目录下的文件名进行排序时,这种逐个处理的方式是行不通的。你必须先将文件名存储起来,当所有的文件名都找到后,再对它们进行排序。为了完成这项任务,你可以建立一个指向find_t结构的指针数组,这样,每找到一个文件名,就可以为相应的find_t结构分配一块内存,将其存储起来。当所有的文件名都找到后,就可以用qsort()函数按文件名对所得到的find_t结构数组进行排序了。

qsort()函数是一个标准C库函数,它有4个参数:指向待排数组的指针,待排元素的数目,每个元素的大小,指向用来比较待排数组中两个元素的函数的指针。比较函数是你要提供的一个用户自定义函数,根据所比较的第一个元素是大于、小于或等于第二个元素,它将返回一个大于、小于或等于0的值。请看下例:

#include <stdio.h>
#include <direct.h>
#include <dos.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
typedef struct find_t FILE_BLOCK ;
int sort_files(FILE_BLOCK * * , FILE-BLOCK * * );
void main(void);
void main(void)
{
      FILE_BLOCK f_block;        /* Define the find_t structure variable */
      int ret_code;              /* Define a variable to store the return codes */
      FILE_BLOCK * * file_block; /* Used to sort the files */
      int file_count;            /* Used to count the flies */
      int x;                     /* Counter variable */
      file_count = -1;
      /* Allocate room to hold up to 512 directory entries.  */
      file_list = (FILE_BLOCK * * ) malloc(sizeof(FILE_BLOCK * ) * 512);
      printf("\nDirectory listing of all files in this directory ; \n\n");
      /* Use the " *. * " file mask and the 0xFF attribute mask to list
            all files in the directory, including system files, hidden
            files, and subdirectory names.  */
      ret_code = _dos_findfirst(" *.* ", 0xFF, &f_block);
      /* The _dos_findfirst() function returns a 0 when it is successful
          and has found a valid filename in the directory.  */
      while (ret_code == 0 && file_count < 512)
      {
           /* Add this filename to the file list */
           file_list[++ file_count] =
                 (FILE_BLOCK * ) malloc (sizeof(FILE_BLOCK));
            * flile_list[file_count] = f_block;
           /* Use the _dos_findnext() function to look
                for the next file in the directory.  */
           ret_code = _dos_findnext (&f_block);
      }
      /* Sort the files */
      qsort(file_list, file_count, sizeof(FILE_BLOCK * ), sort_files);
       /* Now, iterate through the sorted array of filenames and
            print each entry.  */
      for (x=0; x<file_count; x++)
      {
           printf(" %-12s\n", file_list[x]->name);
      }
      printf("\nEnd of directory listing. \n" );
}
int sort_files(FILE_BLOCK* * a, FILE_BLOCK* * b)
{
      return (strcmp((*a)->name, (*b)->name));
}

在上例中,由用户自定义的函数sort_files()来比较两个文件名,它的返回值实际就是标准C库函数strcmp()的返回值。只要相应地改变sort_files()函数的操作对象,上例就可按日期、时间或扩展名进行排序。  

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门