怎样用C语言对某个目录下的文件名进行排序?
在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 retur
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()函数的操作对象,上例就可按日期、时间或扩展名进行排序。
当你对某个目录下的文件名进行排序时,这种逐个处理的方式是行不通的。你必须先将文件名存储起来,当所有的文件名都找到后,再对它们进行排序。为了完成这项任务,你可以建立一个指向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 retur
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()函数的操作对象,上例就可按日期、时间或扩展名进行排序。