专题1 C/C++ 文件读写
#本文件所述内容遵循C/C++原汁原味思想。
#YangJD 2013/8/2 整理
#http://blog.youkuaiyun.com/cquredstar
一、C环境下文件夹操作
C的文件夹操作相关的结构体和函数定义在头文件io.h中。主要有结构体_finddata_t,函数_access、_findfirst、_findnext和_findclose。
1.结构体 _finddata_t内容如下:
#define _finddata_t _finddata64i32_t
struct _finddata64i32_t {
unsigned attrib;
__time64_t time_create; /* -1 for FAT file systems */
__time64_t time_access; /* -1 for FAT file systems */
__time64_t time_write; /*typedef __int64 __time64_t;*/
_fsize_t size; /*typedef unsigned long _fsize_t;*/
char name[260];
};
unsinged attrib的值有以下几种:
_A_ARCH(存档)
_A_HIDDEN(隐藏)
_A_NORMAL(正常)
_A_RDONLY(只读)
_A_SUBDIR(文件夹)
_A_SYSTEM(系统)
它们本身都是2的幂的宏定义。
2. 相关函数
_access函数的声明与定义
int _access(_In_z_ const char * _Filename, _In_int _AccessMode);
返回值:若文件或文件夹存在,则返回非 -1值;若不存在,返回-1
参数:_Filename是文件夹或文件的路径字符串;_AccessMode指期望访问的方式。
_findfirst函数的声明与定义
#define_findfirst _findfirst32
long _findfirst(char *filespec, struct _finddata_t *fileinfo );
返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
参数:filespec标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件;fileinfo用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。
_findnext函数的声明和定义
#define_findnext _findfirst32
int _findnext( long handle, struct _finddata_t*fileinfo );
返回值:若成功返回0,否则返回-1。
参数:handle是由_findfirst函数返回回来的句柄;fileinfo是用来存放文件信息的结构体的指针。
_findclose函数的声明和定义
int _findclose( long handle );
返回值:成功返回0,失败返回-1。
参数: handle是由_findfirst函数返回的句柄。
3.示例程序
#pragma once
#include <io.h>/* 声明了文件夹或文件属性操作的结构体及函数 */
#include <stdio.h> /* 声明了标准输入相关的宏定义或函数 */
#include <stdlib.h> /* system("");要用到*/
#include <string.h> /* 定义了字符串操作相关函数*/
int main(int argn,char** argv)
{
/*char*dir=".//test";*/
chardir[128];
charfilename[128];
struct_finddata_t fddata;/*必须加上struct说明*/
printf("pleaseinput an dir path:");
scanf("%s",dir);
if(_access(dir,0)==-1)
{
printf("%sis unavalible.",dir);
system("pause");
return-1;
}
strcpy(filename,dir);
strcat(filename,"//*.*");
longhandle_fd=_findfirst(filename,&fddata);/*找到当前文件或文件夹下第一个文件*/
if(!handle_fd)/*检查是否找到*/
{
printf("%sis unavalible.",filename);
system("pause");
return-1;
}
do
{
if(fddata.attrib==_A_SUBDIR)
{
printf("Dir: %s\n",fddata.name);