精华内容
下载资源
问答
  • 最近学到操作系统的文件管理,研究了一下文件查询,代码如下1.完整版(老师给出的示例代码)#include "windows.h"#include "stdio.h"int num=0;void find(char *path,char *name){char szFind[MAX_PATH],szFile[MAX_...

    最近学到操作系统的文件管理,研究了一下文件查询,代码如下

    1.完整版(老师给出的示例代码)

    #include "windows.h"

    #include "stdio.h"

    int num=0;

    void find(char *path,char *name)

    {

    char szFind[MAX_PATH],szFile[MAX_PATH];

    WIN32_FIND_DATA fd;

    sprintf(szFind,"%s\\%s",path,name);

    HANDLE hFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE!=hFind)

    {

    while(1)

    {

    printf("\n%s\\%s\n",path,fd.cFileName);

    num++;

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    }

    sprintf(szFind,"%s\\*.*",path);

    hFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE==hFind)return;

    while(TRUE)

    {

    if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

    {

    if(fd.cFileName[0]!='.')

    {

    sprintf(szFile,"%s\\%s",path,fd.cFileName);

    find(szFile,name);

    }

    }

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    }

    int main()

    {

    DWORD dwSize = MAX_PATH;

    char szLogicalDrives[MAX_PATH] = {0};

    char name[]="pra*.*";

    //获取逻辑驱动器号字符串

    DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);

    //处理获取到的结果

    if (dwResult > 0 && dwResult <= MAX_PATH) {

    char* szSingleDrive = szLogicalDrives; //从缓冲区起始地址开始

    while(*szSingleDrive)

    {

    printf("Drive: %s ", szSingleDrive); //输出单个驱动器的驱动器号

    switch(GetDriveType(szSingleDrive))

    {

    case DRIVE_UNKNOWN : puts("未知的磁盘类型"); break;

    case DRIVE_NO_ROOT_DIR: puts("路径无效"); break;

    case DRIVE_REMOVABLE : puts("可移动磁盘"); break;

    case DRIVE_FIXED : puts("固定磁盘");

    find(szSingleDrive,name);

    break;

    case DRIVE_REMOTE : puts("网络磁盘"); break;

    case DRIVE_CDROM : puts("光驱"); break;

    case DRIVE_RAMDISK : puts("内存映射盘"); break;

    default:break;

    }

    // 获取下一个驱动器号起始地址

    szSingleDrive += strlen(szSingleDrive) + 1;

    }

    }

    return 0;

    }

    2.分析

    ///获取盘符

    DWORD dwSize = MAX_PATH;

    char szLogicalDrives[MAX_PATH] = {0};//获取逻辑驱动器号字符串

    DWORD dwResult =GetLogicalDriveStrings(dwSize,szLogicalDrives);

    char* szSingleDrive =szLogicalDrives;  //从缓冲区起始地址开始

    while(* szSingleDrive){

    printf("Drive: %s     ", szSingleDrive);

    szSingleDrive += strlen(szSingleDrive)+ 1;}

    ///获取当前目录下目标文件

    char szFind[MAX_PATH];

    WIN32_FIND_DATA fd;

    sprintf(szFind,"%s\\%s",path,name);

    HANDLEhFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE!=hFind)

    {

    while(1)

    {

    printf("\n%s\\%s\n",path,fd.cFileName);

    num++;

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    }

    ///获取目录

    sprintf(szFind,"%s\\*.*",path);

    hFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE==hFind)return0;

    while(TRUE)

    {

    if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

    {

    if(fd.cFileName[0]!='.')

    {

    sprintf(szFile,"%s\\%s",path,fd.cFileName);

    find(szFile,name);//递归调用

    }

    }

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    3.知识点:

    盘符的类型很多,可以用GetDriveType(当前盘符)【GetDriveType(szSingleDrive)】获取

    获取下一个盘符:szSingleDrive += strlen(szSingleDrive) + 1;

    文件: FindFirstFile(szFind,&fd)与FindNextFile(hFind,&fd),可以用或者判定前者是否结束

    WIN32_FIND_DATA,该结构的内容如下:

    typedef struct _WIN32_FIND_DATA {                         DWORD dwFileAttributes; //文件属性

    FILETIME ftCreationTime; // 文件创建时间

    FILETIME ftLastAccessTime; // 文件最后一次访问时间

    FILETIME ftLastWriteTime; // 文件最后一次修改时间

    DWORD nFileSizeHigh; // 文件长度高32位

    DWORD nFileSizeLow; // 文件长度低32位

    DWORD dwReserved0; //统保留

    DWORD dwReserved1; // 系系统保留

    TCHAR cFileName[ MAX_PATH ]; // 长文件名

    TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名

    } WIN32_FIND_DATA, *PWIN32_FIND_DATA;

    #define FILE_ATTRIBUTE_DIRECTORY  0x00000010  文件夹 第5位                       判断是文件还是目录

    fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY   &:相同为1,不同为0

    if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)运算为1就是文件夹,0为文件

    if(fd.cFileName[0]!='.')  .表示当前路径,..表示后退一布路径

    4.简单文件查询(根据windows自带的文件查询命令简化)

    #include #include #include int main()

    {

    DWORD dwDriveStrLen;

    char wDrivesName[ 0x100 ];

    dwDriveStrLen = sizeof( wDrivesName );

    GetLogicalDriveStrings(dwDriveStrLen, wDrivesName);

    char *p = ( char * )wDrivesName;//得到所有盘符

    char str[1000],name[100];

    scanf("%s",name);

    while( *p )

    {

    sprintf(str,"for /r %s %%i in (%s) do @echo %%i",p,name);

    p += ( strlen( p ) + 1 );

    system(str);//执行查询命令

    }

    return 0;

    }

    展开全文
  • Windows下C语言查找文件例子 // 2_4.cpp : Defines the entry point for the console application. // //========================================================================= // 作者 : 欧阳文光 // ...

    Windows下C语言查找文件例子

    // 2_4.cpp : Defines the entry point for the console application.
    //
    //========================================================================= 
    // 作者   : 欧阳文光
    // 邮箱   : ssun125@163.com	
    // 博客   : http://blog.csdn.net/ssun125
    // 描述   : c语言文件查找
    // 使用   : cmd下search.exe 目录 文件(可以用通配符*、?)(如:search.exe E: *.java)
    // 日期   : 2013年01月25日
    //=========================================================================
    
    #include "stdafx.h"
    #include <STDIO.H>
    #include <MALLOC.H>
    #include <STRING.H>
    #include <windows.h>
    
    //使用链表保存每个找到的文件夹
    typedef struct DirList{
    	char name[256];
    	DirList * next;
    } *LpDirList;
    
    DirList * first, * last; 
    
    //往链表中添加节点
    void add(char * name)
    {
    	DirList * newDir = (LpDirList)malloc(sizeof(DirList));
    	strcpy(newDir->name, name);
    	newDir->next = NULL;
    	last->next = newDir;
    	last = newDir; 
    }
    
    void loopFind(char * dir, char * filename)
    {
    	//printf("层次遍历文件夹...\n");
    	char searchName[256] = {0};
    	char nextDir[256] = {0};	
    	strcpy(searchName, dir);
    	strcat(searchName, "\\**");
    	//保存找到的文件或文件夹的信息的结构体
    	WIN32_FIND_DATA findData;
    	HANDLE hFindFile = FindFirstFile(searchName, &findData);
    	while (FindNextFile(hFindFile, &findData))
    	{
    		if(findData.cFileName[0] == '.') continue;
    		if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    		{
    			strcpy(nextDir, dir);
    			strcat(nextDir, "\\");
    			strcat(nextDir, findData.cFileName);			
    			add(nextDir);					
    			memset(nextDir, 0x00, sizeof(nextDir));
    		}		
    	}
    	//查找符合条件的文件,并输出
    	char nextFileName[256] = {0};
    	memset(searchName, 0x00, sizeof(searchName));
    	strcpy(searchName, dir);
    	strcat(searchName, "\\");
    	strcat(searchName, filename);
    	hFindFile = FindFirstFile(searchName, &findData);
    	while (FindNextFile(hFindFile, &findData))
    	{
    		strcpy(nextFileName, dir);
    		strcat(nextFileName, "\\");
    		strcat(nextFileName, findData.cFileName);
    		printf("%s\n", nextFileName);							
    	}
    
    } 
    
    void search(char * dir, char * filename)
    {
    	printf("开始搜索...\n");
    	first = (LpDirList)malloc(sizeof(DirList));
    	strcpy(first->name, dir);
    	first->next = NULL;
    	last = first;
    	while (first != NULL)
    	{
    		loopFind(first->name, filename);
    		first = first->next;
    	}
    }
    
    int main(int argc, char* argv[])
    {
    	if(argv[1]==NULL || argv[2]==NULL)
    	{ 
    		printf("请输入目录或文件!\n");
    		return 0;
    	}
    	search(argv[1], argv[2]);
    	return 0;
    }
    

    结果截图:



    展开全文
  • 梓益C语言学习笔记之数据类型一、整型1.字符型char 1字节 8bit2.短整型short 2字节 16bit3.长整型long 4字节 32bit4.整型int 在32位系统下是4字节,在16位系统下是2字节二、实型1.单精度实型float 4字节 32bit 7位...

    梓益C语言学习笔记之数据类型

    一、整型

    1.字符型char 1字节 8bit

    2.短整型short 2字节 16bit

    3.长整型long 4字节 32bit

    4.整型int 在32位系统下是4字节,在16位系统下是2字节

    二、实型

    1.单精度实型float 4字节 32bit 7位有效数字

    2.双精度实型double 8字节 64bit 16位有效数字

    3.可用指数形式表示,如:2.1E5(2.1*10^5)

    4.实型常量如果不加f则系统默认为double型

    5.C语言系统固定格式输出只有小数点后六位,如要输出八位写%0.8f,如写%8f则小数点前宽度为8

    6.自动类型转换时为保持精度,系统自动向多字节类型转换,有符号和无符号时自动向无符号转换

    7.赋值时右边的类型转换为左边的类型(如整型量按字符型处理时,只有低八位参与运算)

    三、变量的存储类型

    auto自动变量----不常用

    register寄存器变量----不常用

    extern引用外部变量

    static静态变量

    const只读变量,值不能改变

    四、其他

    typedef类型重定义如:typedef unsigned char u8

    负数是正数的补码(取反加1)

    左移:高位溢出,低位补零

    带符号右移高位补符号位,低位溢出。如-1(11111111),右移还是-1

    单目运算符:单目标运算符,如++,--

    双目运算符:双目标运算符,如+,-,*,/

    Linux特点:树状文件结构,一切皆文件

    /根路径

    /bin系统二进制文件路径(可执行文件)

    /boot系统启动路径

    /dev设备文件

    /etc系统配置文件

    /home家路径,用户目录

    /lib库文件

    /lost+found备份文件

    /media媒体文件

    /mnt挂载文件

    /usr用户二进制、库等文件

    命令 ./当前路径 ..上一级路径 ~用户家路径 -之前路径 >输出重定向

    pwd显示路径 mkdir创建目录 touch创建文件 cat显示文件

    find查找文件find / -name sources.list

    grep查找文件内容grep print /usr -n -r

    gzip 压缩 tar zcvf bk.tar.gz tt.c 加-C指定目录 解压 tar zxvf bk.tar.gz

    vi编辑器

    i键,插入模式

    Esc键,编辑模式 yy复制 p粘贴 u撤销 dd剪切 /查找

    shift+:命令模式w保存 q退出

    \p

    \im插入main()函数

    \ip插入printf ()函数

    展开全文
  • C语言查找文件-> _finddata_t 的使用

    千次阅读 2017-11-11 03:04:40
    那么到底如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~...
    那么到底如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在<io.h>的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~
            首先讲这个结构体吧~ struct _finddata_t ,这个结构体是用来存储文件各种信息的。说实话,这个结构体的具体定义代码,我没有找到,不过还好,文档里面在_find里有比较详细的成员变量介绍。我基本上就把文档翻译过来讲吧:


            unsigned atrrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在<io.h>中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。


            time_t time_create:这里的time_t是一个变量类型(长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。


            time_t time_access:文件最后一次被访问的时间。


            time_t time_write:文件最后一次被修改的时间。


            _fsize_t size:文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。


            char name[_MAX_FNAME]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在<stdlib.h>头文件中被定义,表示的是文件名的最大长度。


            以此,我们可以推测出,struct _finddata_t ,大概的定义如下:


            struct _finddata_t
            {
                 unsigned attrib;
                 time_t time_create;
                 time_t time_access;
                 time_t time_write;
                 _fsize_t size;
                 char name[_MAX_FNAME];
            };


            前面也说了,这个结构体是用来存储文件信息的,那么如何把一个硬盘文件的文件信息“存到”这个结构体所表示的内存空间里去呢?这就要靠_findfirst、_findnext和_fineclose三个函数的搭配使用了。


            首先还是对这三个函数一一介绍一番吧……


            long _findfirst( char *filespec, struct _finddata_t *fileinfo );


            返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。


            参数:


            filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。


            fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。


            int _findnext( long handle, struct _finddata_t *fileinfo );


            返回值:若成功返回0,否则返回-1。


            参数:


            handle:即由_findfirst函数返回回来的句柄。


            fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。


           int _findclose( long handle );


            返回值:成功返回0,失败返回-1。


            参数:


            handle :_findfirst函数返回回来的句柄。


            大家看到这里,估计都能猜到个大概了吧?先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。恩,对,这就是正确思路。下面我们就按照这样的思路来编写一个查找C:\WINDOWS文件夹下的所有exe可执行文件的程序。


            #include <stdio.h>
            #include <io.h>


            const char *to_search="C:\\WINDOWS\\*.exe";        //欲查找的文件,支持通配符


            int main()
            {
                 long handle;                                                //用于查找的句柄
                 struct _finddata_t fileinfo;                          //文件信息的结构体
                 handle=_findfirst(to_search,&fileinfo);         //第一次查找
                 if(-1==handle)return -1;
                 printf("%s\n",fileinfo.name);                         //打印出找到的文件的文件名
                 while(!_findnext(handle,&fileinfo))               //循环查找其他符合的文件,知道找不到其他的为止
                 {
                      printf("%s\n",fileinfo.name);
                }
                 _findclose(handle);                                      //别忘了关闭句柄
                 system("pause");
                 return 0;
            }


            当然,这个文件的查找是在指定的路径中进行,如何遍历硬盘,在整个硬盘中查找文件呢?大家可以在网络上搜索文件递归遍历等方法,这里不再做进一步介绍。


            细心的朋友可能会注意到我在程序的末尾用了一个system函数。这个与程序本身并没有影响,和以前介绍给大家的使用getchar()函数的作用相同,只是为了暂停一下,让我们能看到命令提示符上输出的结果而已。不过system函数本身是一个非常强大的函数。大家可以查查MSDN看看~ 简单来说,它是一个C语言与操作系统的相互平台,可以在程序里通过这个函数,向操作系统传递command命令
    展开全文
  • 我试图制作一个程序,它接受来自ubuntu终端的命令并同时读入一个文件。如果用户键入“-c”,它将读取文件并打印字符计数,如果用户键入“-w”,它将从读取的文件中...C语言命令行参数+在文件中读取#include #includ...
  • C语言文件查找

    2020-05-03 13:55:31
    C 语言文件查找 Struct _finddata_t是用来存储文件各种信息的结构体,使用这个结构体要引用的头文件为“ #include <io.h>”它的结构体定义如下: struct _finddata_t { unsigned attrib; time_t time_...
  • c语言实现文件查找

    千次阅读 2017-06-08 08:28:05
    最近学到操作系统的文件管理,研究了一下文件查询,代码如下 1.完整版(老师给出的示例代码) #include "windows.h" #include "stdio.h" int num=0; void find(char *path,char *name) { char szFind[MAX_PATH],...
  • c语言文件查找,遍历

    千次阅读 2014-05-28 15:08:41
    关于用c语言文件查找和遍历。
  • C语言实现文件的模糊查找.pdf
  • c语言文件查找

    2008-03-26 09:45:00
    int main(){ struct _finddata_t c_file; long hFile; /* Find first .c file in current directory */ if( (hFile = _findfirst( "*.c", &c_file )) == -1L ) printf( "No *.c files...
  • 输入一段字符,将今日日期和字符保存到指定text文件,输入多次后,根据日期查找,将日期以后的字符输出到下一个日期为止。怎么用c语言实现鸭</p>
  • 最近在linux下要干点和c语言相关的任务,其中涉及使用C语言查找一个文件夹下指定扩展名的所有文件,我去开始在网上查找后粘贴后不能用,最后发现是windows下才能使用。最后找到了一篇不错的文章,...
  • 各位大神,我是菜鸟,希望用c语言编程实现按照关键字或者部分文件名查找文件
  • C语言 读取文件 查找字符串

    万次阅读 2013-12-13 14:02:57
    int spilt_string(char *string) {  int i=0;  const char *split="=";  char *p;    p = strtok(string,split);  while(p)  {  if(i == 1)  { strcpy(string,p); //printf("Co
  • 最近发现手机越来越卡,后来发现是QQ占用的内存太大了,尤其是居然有1.5G之多的shortvideo短视频,我这种人,老觉得这都是生活的记录,舍不得删,...首先在shortvideo文件夹下进行一次磁盘遍历,然后每找到一个mp4文件
  • #include #include #include #include #include #include #include int is_in(char *s, char *c);int main(int argc, char *argv[]){char prefix[] = “enter your string”;char filepath[] = “enter your path”;...
  • C语言查找与排序.ppt

    2020-12-01 21:35:03
    当我们把顺序表示的文件(R1R2Rn)看作为顺序二叉树时由顺序二叉树的性质可知记录Ri(1)的双亲是记录R[i 2]R1的左孩子是记录R2i(2in)但若2i>n则Ri的左孩子不存在Ri的右孩子是记录R2i+1(2i+1n)但若2i+1>n则Ri的右孩子不...
  • 创建一个文件test.txt,内容如下: It is a test line It is a test line It is a test line It is a test line It is a test line ok, 'hello' is here 现在运行程序: $ ./a. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,925
精华内容 770
关键字:

c语言查找文件

c语言 订阅