3 个解决方案
#1
FindFirstFile
FindNextFile
FindClose
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位是只读标志位
}
//
// 函数功能:
// 在指定的目录及其子目录里面,根据指定的文件类型查找所有文件
//
// 文件原型:
// 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
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位是只读标志位
}
//
// 函数功能:
// 在指定的目录及其子目录里面,根据指定的文件类型查找所有文件
//
// 文件原型:
// 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位是只读标志位
}