windows编程一日一练(2)

来源:互联网 发布:淘宝二手机可靠吗 编辑:程序博客网 时间:2024/05/01 11:47

今天主要看看文件练习相关的函数

简单的看了一下C的文件操作函数:

1.打开文件

FILE *fopen(const char *filename,const char *mode)

解释:这是c提供的一个文件操作函数,若打开成功,则返回一个指向该文件的指针(注意不是句柄,从这也可看出指针跟句柄的区别),mode常用取值列表如下

 文件打开方式含义"w"(只写)为输出打开一个文本文件"r"(只读)为输入打开一个文本文件"a"(追加)追加内容"w+"(读/写)为读/写建立一个新文本文件
"r+"(读/写)为读/写打开一个文本文件
"a+"(读/写)为读/写打开一个文本文件

2。关闭文件

int fclose(FILOE *fp);

3.读文件

int fgetc(FILE *fp)   //从打开的文件中读取一个字符,指针后移一位

size_t fread(VOID *buffer,size_t size,size_t count,FILE *fp)   

解释:buffer是指向数据存放缓冲区的指针,size是单个字符的字节数,count是一次读取多少个size的数据.若函数执行成功,则返回实际读取的字符数。

4.写文件

int fputc(FILE *fp);

size_t fwrite(VOID *buffer,size_t size,size_t count,FILE *fp) ;//跟读文件是一样的,这里就不记了。

另外有一个非常常用的函数,fprintf函数,其原型是

int fprintf(FILE *fp,const char *format[,argument].....);

在这里举个实例便于理解:

char buffer[]="world";                     //定义并赋值一个字符串

FILE fp;                                         //定义一个文件指针

if(fp=fopen("c:\test.txt","a")==NULL)  //打开文件test.txt,并判断操作是否成功

     exit(0);                                       //若失败,则退出

fprintf(fp,"hello %s",buffer);           //把hello和字符串buffer中的内容追加入文件test.txt

5.指针定位

由于这类函数用的比较少,这里只简单记一下函数名及其功能

void rewind(FILE *fp);//指针返回文件开始

int fseek(FILE *fp,long offset,int origin);//指针定位到指定位置

long ftell(FILE *fp);//返回文件指针相对于文件开头的位置

以上介绍的都是c提供的对文件的操作函数,其实windows提供了一些功能更强大的API函数供开发人员使用,虽说微软推荐使用API函数来处理文件,但个人还是不太习惯,主要是参数过多,很多功能用不到,所谓杀鸡焉用宰牛刀,所以只有在迫不得已的时候才使用API,下面介绍几个常用的:

BOOL DeleteFile(LPCTSTR  lpFileName); //删除文件,lpFileName为完整文件名

创建目录函数CreateDirectory;其原型如下,第二个参数为目录的安全性设置,通常为NULL

BOOL CreateDirectory(

   LPCTSTR lpPathName,

   LPSECURITY_ATTRIBUTES lpSecurityAttributes,

);

文件的复制和重命名可以用CopyFile()函数实现,其源代码如下:

BOOL CopyFile(

   LPCTSTR SrcFileName,    //完整源文件名

   LPCTSTR DesFileName,  //完整目标文件名

   BOOL bFailIfExits;

)

文件和目录的移动都可以用RemoveFlie()实现,并且当移动目录时会强制移动目录下的所有文件和子目录,

BOOL MoveFile(

   LPCTSTR SrcFileName,   //源路径

   LPCTSTR  DesFileName,  //目标路径

)

最后介绍两个有关文件属性相关的函数

DWORD GetFileAttributes(LPCTSTR  lpFileName);

该函数若执行成功,则返回文件的属性,否则返回0xFFFFFFFF.


BOOL SetFileAttributes(

   LPCTSTR lpFileName,

   DWORD dwFileAttributes

);
该函数设置文件属性,第二个参数取值范围如下:

dwFileAttributes取值
含义解释
FILE_ATTRIBUTES_ARCHIVE
存档文件
FILE_ATTRIBUTES_COMPRESSED
压缩文件
FILE_ATTRIBUTES_DERECTORY
文件夹
FILE_ATTRIBUTES_ENCRYPTED
加密文件
FILE_ATTRIBUTES_HIDDEN
隐藏文件
FILE_ATTRIBUTES_NORMAL
正常
FILE_ATTRIBUTES_OFFLINE
脱机文件
FILE_ATTRIBUTES_READONLY
只读文件
FILE_ATTRIBUTES_SYSTEM
系统属性
FILE_ATTRIBUTES_TEMPORARY
临时属性





至此,对于文件的操作已经都不是问题了,现在尝试编写一个小应用,实现批量重命名功能.

步骤:1.  用GetModuleFile()函数获取程序所在目录filepath

2 . .获取目录下所有符合条件的文件名,并将这些文件名存在一个集合(set)中,涉及到的函数有_FindFrist(),    _FindNext();   _FindClose(),这些函数都包含在<io.h>头文件中。后面会详细介绍一下这些函数

3.循环实现文件重命名,CopyFile();

4.很重要的一步,CopyFile()函数之后记得删除原来的文件DeleteFile();

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函数返回回来的句柄。


_finddata_t结构体定义如下::
struct _finddata_t {
 

  unsigned   attrib;
 
  time_t     time_create;   
 
  time_t     time_access;   
 
  time_t     time_write;
 
  _fsize_t   size;
 
  char       name[260];
};

time_t,其实就是long
而_fsize_t,就是unsigned long
现在来解释一下结构体的数据成员吧。
attrib,就是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。

time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。
size:文件大小
name:文件名。
  至此,批量重命名的引用就完全可以实现了,至于具体的代码实现,明天在做,今天就到这了



原创粉丝点击