如何获得当前目录下的文件和文件夹列表?

时间:2021-09-15 12:22:04
利用windows api怎样可以获得当前目录下的文件和文件夹名字列表?谢谢大家了

3 个解决方案

#1


FindFirstFile
FindNextFile
FindClose

#2


GetModuleFileName

#3


////////////////////////////////////////////////////////////////
//
// 函数功能:
//   在指定的目录及其子目录里面,根据指定的文件类型查找所有文件
//
// 文件原型:
//   struct file_list* lookfor_files(CString Path,
//                                   CString Type,
//                                   BOOL include_subdir)
// 参数介绍:
//   Path:路径;
//   Type:文件类型;
//   include_subdir:是否包含子文件夹
// 
// 返回值:
//   返回一个链表的头指针
//   该链表里面存放的是所有符合要求的文件的全路径名
//
// 链表的节点定义如下
//  struct file_list
//  {
//    CString PathName;
// unsigned long size;
// struct file_list* next;
//  };
//
// 算法思想:
//   建立一个路径队列
//   依次从队列中取出一个文件夹,直到队列为空
//   {
//      首先找出文件夹下的所有符合要求的文件,加入文件链表
//      if (include_subdir)
//      {
//         的值找出该文件夹下的所有子文件夹,加入文件夹队列
//      }
//   }
//
// 需要调用的函数
//   1、逆转一个链表
//      struct file_list* reverse_link(struct file_list *Head);
//   2、把路径名和文件名合成全路径文件名
//      CString MergePathName(CString Path, 
//                            CString Name);
//
// 调用示例:
// CString Dir,Type;
// Dir = "d:\\test";
// Type="*.*";  // 这个参数能找到所有的文件和路径
// Type="1.*";  // 找到所有以1为主文件名而且带扩展名的文件
//              // 例如:1.txt
// Type="1*.*"; // 找到所有以1开头的文件
//          // 例如:1.txt 1 12 123.txt 
// Type="1*";   // 功能同1*.*
// Type="1*.";  // 找到所有以1开头不带扩展名的文件
//          // 例如:1 12
// Type="*.??t";  
// BOOL bSearchSubDir = TRUE;
// struct file_list *Head=NULL;
// Head = FindFilesOfTypeAsLink_C_Queue(Dir,Type,bSearchSubDir);
//
// 程序作者:胡子,bushiwoshishui@bbi.edu.cn
//
// 代码编写时间:2004年9月11号
//
////////////////////////////////////////////////////////////////
struct file_list* CMyFilePath::FindFilesOfTypeAsLink_C_Queue(CString Path,CString Type,BOOL include_subdir)
{

// 定义存放目录的一个队列链表
// 如果包含子文件夹的话,该队列用来存储尚未操作的文件夹
struct path_queue
{
CString pathname;
struct path_queue *next;
}HeadPathQueue,*rear,*p_queue; // 头节点、尾指针和临时操作指针

// 首先文件夹Path入队
p_queue=new (struct path_queue);
p_queue->next=NULL;
p_queue->pathname=Path;
HeadPathQueue.next=p_queue;
rear=p_queue;

//开始查找
//找到就放到以Head开头的链表里面
struct file_list *Head=NULL,*p;
_finddata_t info; //存放匹配文件信息的结构变量

// 当队列不空的时候,就从队列的头部取出一个节点
// 然后将这个节点删掉
// 该节点存放当前要操作的路径
while (HeadPathQueue.next!=NULL)
{
// 从队列里面取出一个路径
CString now_path;
p_queue=HeadPathQueue.next;
now_path=p_queue->pathname;
HeadPathQueue.next=p_queue->next;
delete(p_queue);

// 如果队列为空,就将rear指向HeadPathQueue
if (HeadPathQueue.next==NULL)
rear=&HeadPathQueue;

// 把文件路径和类型合在一块儿,以便查找符合条件的文件
CString PathType=MergePathName(now_path,Type);

// 开始查找文件
errno=0; // 首先设置错误编号,0表示没有错误
long handle=_findfirst(PathType,&info); //找第一个文件
if (errno==0)
{
do{
int test=info.attrib&16;
if (test!=16)
{
// 说明是文件不是文件夹
// 是文件就加入到文件列表当中去
CString full_name=MergePathName(now_path,info.name);
p=new(struct file_list);
p->PathName=full_name;
p->size=info.size;
p->next=Head;
Head=p;
}
}while (_findnext(handle,&info) == 0); //找其他的文件
}


if (include_subdir)
{
// 把文件路径和"*.*"合在一块儿,以便查找所有的的文件夹
CString PathType=MergePathName(now_path,"*.*");

// 开始查找文件
errno=0; // 首先设置错误编号,0表示没有错误
long handle=_findfirst(PathType,&info); //找第一个文件或者文件夹
if (errno==0)
{
do{
int test=info.attrib&16;
if (test==16)
{
// 说明是文件夹
// 是文件夹就加入到搜索队列中去
if (strcmp(info.name,".")!=0 && strcmp(info.name,"..")!=0)
{
CString new_path=MergePathName(now_path,info.name);
p_queue=new (struct path_queue);
p_queue->next=NULL;
p_queue->pathname=new_path;
rear->next=p_queue;
rear=p_queue;
}
}
}while (_findnext(handle,&info) == 0); //找其他的文件夹
} // end of ---- if (errno==0)
} // end of ----- if (include_subdir)
}

//逆转链表
Head=reverse_link(Head);

return (Head);

// 注意:
// info.attrib存放文件的属性
// 右边数第6位是存档标志位
// 右边数第5位是文件夹标志位
// 右边数第3位是系统属性标志位
// 右边数第2位是隐藏属性标志位
// 右边数第1位是只读标志位
}

#1


FindFirstFile
FindNextFile
FindClose

#2


GetModuleFileName

#3


////////////////////////////////////////////////////////////////
//
// 函数功能:
//   在指定的目录及其子目录里面,根据指定的文件类型查找所有文件
//
// 文件原型:
//   struct file_list* lookfor_files(CString Path,
//                                   CString Type,
//                                   BOOL include_subdir)
// 参数介绍:
//   Path:路径;
//   Type:文件类型;
//   include_subdir:是否包含子文件夹
// 
// 返回值:
//   返回一个链表的头指针
//   该链表里面存放的是所有符合要求的文件的全路径名
//
// 链表的节点定义如下
//  struct file_list
//  {
//    CString PathName;
// unsigned long size;
// struct file_list* next;
//  };
//
// 算法思想:
//   建立一个路径队列
//   依次从队列中取出一个文件夹,直到队列为空
//   {
//      首先找出文件夹下的所有符合要求的文件,加入文件链表
//      if (include_subdir)
//      {
//         的值找出该文件夹下的所有子文件夹,加入文件夹队列
//      }
//   }
//
// 需要调用的函数
//   1、逆转一个链表
//      struct file_list* reverse_link(struct file_list *Head);
//   2、把路径名和文件名合成全路径文件名
//      CString MergePathName(CString Path, 
//                            CString Name);
//
// 调用示例:
// CString Dir,Type;
// Dir = "d:\\test";
// Type="*.*";  // 这个参数能找到所有的文件和路径
// Type="1.*";  // 找到所有以1为主文件名而且带扩展名的文件
//              // 例如:1.txt
// Type="1*.*"; // 找到所有以1开头的文件
//          // 例如:1.txt 1 12 123.txt 
// Type="1*";   // 功能同1*.*
// Type="1*.";  // 找到所有以1开头不带扩展名的文件
//          // 例如:1 12
// Type="*.??t";  
// BOOL bSearchSubDir = TRUE;
// struct file_list *Head=NULL;
// Head = FindFilesOfTypeAsLink_C_Queue(Dir,Type,bSearchSubDir);
//
// 程序作者:胡子,bushiwoshishui@bbi.edu.cn
//
// 代码编写时间:2004年9月11号
//
////////////////////////////////////////////////////////////////
struct file_list* CMyFilePath::FindFilesOfTypeAsLink_C_Queue(CString Path,CString Type,BOOL include_subdir)
{

// 定义存放目录的一个队列链表
// 如果包含子文件夹的话,该队列用来存储尚未操作的文件夹
struct path_queue
{
CString pathname;
struct path_queue *next;
}HeadPathQueue,*rear,*p_queue; // 头节点、尾指针和临时操作指针

// 首先文件夹Path入队
p_queue=new (struct path_queue);
p_queue->next=NULL;
p_queue->pathname=Path;
HeadPathQueue.next=p_queue;
rear=p_queue;

//开始查找
//找到就放到以Head开头的链表里面
struct file_list *Head=NULL,*p;
_finddata_t info; //存放匹配文件信息的结构变量

// 当队列不空的时候,就从队列的头部取出一个节点
// 然后将这个节点删掉
// 该节点存放当前要操作的路径
while (HeadPathQueue.next!=NULL)
{
// 从队列里面取出一个路径
CString now_path;
p_queue=HeadPathQueue.next;
now_path=p_queue->pathname;
HeadPathQueue.next=p_queue->next;
delete(p_queue);

// 如果队列为空,就将rear指向HeadPathQueue
if (HeadPathQueue.next==NULL)
rear=&HeadPathQueue;

// 把文件路径和类型合在一块儿,以便查找符合条件的文件
CString PathType=MergePathName(now_path,Type);

// 开始查找文件
errno=0; // 首先设置错误编号,0表示没有错误
long handle=_findfirst(PathType,&info); //找第一个文件
if (errno==0)
{
do{
int test=info.attrib&16;
if (test!=16)
{
// 说明是文件不是文件夹
// 是文件就加入到文件列表当中去
CString full_name=MergePathName(now_path,info.name);
p=new(struct file_list);
p->PathName=full_name;
p->size=info.size;
p->next=Head;
Head=p;
}
}while (_findnext(handle,&info) == 0); //找其他的文件
}


if (include_subdir)
{
// 把文件路径和"*.*"合在一块儿,以便查找所有的的文件夹
CString PathType=MergePathName(now_path,"*.*");

// 开始查找文件
errno=0; // 首先设置错误编号,0表示没有错误
long handle=_findfirst(PathType,&info); //找第一个文件或者文件夹
if (errno==0)
{
do{
int test=info.attrib&16;
if (test==16)
{
// 说明是文件夹
// 是文件夹就加入到搜索队列中去
if (strcmp(info.name,".")!=0 && strcmp(info.name,"..")!=0)
{
CString new_path=MergePathName(now_path,info.name);
p_queue=new (struct path_queue);
p_queue->next=NULL;
p_queue->pathname=new_path;
rear->next=p_queue;
rear=p_queue;
}
}
}while (_findnext(handle,&info) == 0); //找其他的文件夹
} // end of ---- if (errno==0)
} // end of ----- if (include_subdir)
}

//逆转链表
Head=reverse_link(Head);

return (Head);

// 注意:
// info.attrib存放文件的属性
// 右边数第6位是存档标志位
// 右边数第5位是文件夹标志位
// 右边数第3位是系统属性标志位
// 右边数第2位是隐藏属性标志位
// 右边数第1位是只读标志位
}