加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

WINDOWS API操作文件

(2016-08-16 16:19:15)
标签:

c自学教程

c学习

c文件操作

c文件编程

分类: VC 教程

基本概念

1、文件

计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。如下图都是文件。

http://s14/mw690/0023IUaVzy745Z9c8XP6d&690API操作文件" TITLE="WINDOWS API操作文件" />

2、文件夹:

一种是计算机磁盘空间里面为了分类储存电子文件而建立独立路径的目录,文件夹就是一个目录 文件夹图标
名称,我们可以暂且称之为电子文件夹 它提供了指向对应磁盘空间的路径地址,它可以有扩展名,但不具有文件扩展名的作用,也就不象文件那样用扩展名来标识格式。但它有几种类型,如:文档、图片、相册、音乐、音乐集等等。使用文件夹最大优点是为文件的共享和保护提供了方便。 为了分门别类的有序存放文件,操作系统把文件组织在若干目录中,也称文件夹。文件夹一般采用多层次结构(树状结构),在这种结构中每一个磁盘有一个根文件夹,它包含若干文件和文件夹。文件夹不但可以包含文件,而且可包含下一级文件夹,这样类推下去形成的多级文件架结构既帮助了用户将不同类型和功能的文件分类储存,又方便文件查找,还允许不同文件夹中文件拥有同样的文件名。 注:文件名不能超过255个字符(包括空格)。 文件夹是用来组织和管理磁盘文件的一种数据结构。如下图:

http://s6/mw690/0023IUaVzy745Zf5dVXa5&690API操作文件" TITLE="WINDOWS API操作文件" />


编程操作文件

那么对于一个文件,我们如何去操作它呢,比如我们平常双击打开一个WORD文件,OFFICE 程序是怎么把里面的数据读取出来,显示出来的呢。我们通常都是调用WINDOWS提供的APIApplication Programming Interface,应用程序编程接口)接口来操作文件。如下面图,显示的是我们的应用程序调用API接口去访问底层的资源。

http://s2/mw690/0023IUaVzy745ZgtWSJe1&690API操作文件" TITLE="WINDOWS API操作文件" />

我们都知道,文件一般都存放在硬盘,U盘,移动硬盘等介质里,它是属于计算机硬件系统的,我们要去读取必须要通过操作系统,而通过操作系统就必须要调用文件操作的相关API接口来访问。

 

那我们要操作文件要经历哪几步呢。我们可以想象一下,我们平时玩手机,玩电脑的一般步骤是什么呢。你肯定很容易想到:

开机------》开始玩-----》关机。

我们操作一个文件其实步骤也是一样的。

打开文件-----》读写文件-----》关闭文件。

那么要操作一个文件的API都有哪些呢?看下面

 

打开/创建文件

API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。

HANDLE CreateFile(  

LPCTSTR lpFileName, // 要打开的文件名  

DWORD dwDesiredAccess, // 文件的操作属性,期望以什么样的权限来访问文件  

DWORD dwShareMode, // 文件共享属性,打开文件后,希望别人可以以怎么样的共享方式来访问文件 

LPSECURITY_ATTRIBUTES lpSecurityAttributes,// 文件安全特性 ,通常为空 

DWORD dwCreationDisposition, //文件操作,是要创建文件还是要打开文件,具体参数请看下面  

DWORD dwFlagsAndAttributes, // 文件属性  ,创建/打开的文件属性是怎么样的,比如只读,系统文件,隐藏文件

HANDLE hTemplateFile // 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性    ); 

重点函数参数说明如下:

  dwDesiredAccess 文件的操作属性:如果为零,表示只允许获取与一个设备有关的信息,GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);

  dwShareMode 文件的共享属性:零表示不共享; FILE_SHARE_READ FILE_SHARE_WRITE 表示允许对文件进行读/写共享访问;

  dwCreationDisposition 文件的操作有:

  ·CREATE_NEW:创建文件;如文件存在则会出错
  ·CREATE_ALWAYS:创建文件,会改写前一个文件
  ·OPEN_EXISTING:文件必须已经存在。由设备提出要求
  ·OPEN_ALWAYS:如文件不存在则创建它
  ·TRUNCATE_EXISTING:将现有文件缩短为零长度

  dwFlagsAndAttributes 文件属性有:

  ·FILE_ATTRIBUTE_ARCHIVE:标记归档属性
  ·FILE_ATTRIBUTE_COMPRESSED:将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
  ·FILE_ATTRIBUTE_NORMAL:默认属性
  ·FILE_ATTRIBUTE_HIDDEN:隐藏文件或目录
  ·FILE_ATTRIBUTE_READONLY:文件为只读
  ·FILE_ATTRIBUTE_SYSTEM:文件为系统文件
  ·FILE_FLAG_WRITE_THROUGH:操作系统不得推迟对文件的写操作
  ·FILE_FLAG_OVERLAPPED:允许对文件进行重叠操作
  ·FILE_FLAG_NO_BUFFERING:禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
  ·FILE_FLAG_RANDOM_ACCESS:针对随机访问对文件缓冲进行优化
  ·FILE_FLAG_SEQUENTIAL_SCAN:针对连续访问对文件缓冲进行优化
  ·FILE_FLAG_DELETE_ON_CLOSE:关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

   可以组合的属性有:FILE_FLAG_WRITE_THROUGHFILE_FLAG_OVERLAPPED FILE_FLAG_NO_BUFFERINGFILE_FLAG_RANDOM_ACCESS FILE_FLAG_SEQUENTIAL_SCANFILE_FLAG_DELETE_ON_CLOSE FILE_FLAG_BACKUP_SEMANTICSFILE_FLAG_POSIX_SEMANTICS FILE_FLAG_OPEN_REPARSE_POINTFILE_FLAG_OPEN_NO_RECALL

函数的返回值说明

如果成功返回一个打 开文件得句柄,如果调用函数之前文件存在,文件操作属性为:CREATE_ALWAYS OPEN_ALWAYS,使用GetLastError函数返回的是ERROR_ALREADY_EXISTS(包括函数操作成功),如果之前函数不存 在,则返回0。使用失败返回INVALID_HANDLE_VALUE,要取得更多的信息,使用GetLastError函数。

读写文件

CreateFile函数返回的值可以知道,我们可以通过打开的文件句柄去操作文件了。

 

读文件

BOOL ReadFile(

  HANDLE hFile,                // handle to file 文件句柄

  LPVOID lpBuffer,             // data buffer 用于存放读出来的数据

  DWORD nNumberOfBytesToRead,  // number of bytes to read 希望读取的数据字节大小

  LPDWORD lpNumberOfBytesRead, // number of bytes read 真实读到到的数据大小

  LPOVERLAPPED lpOverlapped    // overlapped buffer  如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL

);

 

写文件

BOOL WriteFile(

  HANDLE hFile,                    // handle to file 文件句柄

  LPCVOID lpBuffer,                // data buffer 要写的数据存放的buffer

  DWORD nNumberOfBytesToWrite,     // number of bytes to write  要写多少数据

  LPDWORD lpNumberOfBytesWritten,  // number of bytes written  实际写了多少数据

  LPOVERLAPPED lpOverlapped      // overlapped buffer OVERLAPPED,倘若在指FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。该结构定义了一次异步写操作。否则,该参数应置为NULL

);

关闭文件

不再需要操作文件时,我们需要把打开/创建的文件进行关闭,调用如下API

BOOL CloseHandle(

  HANDLE hObject   // handle to object  要关闭的文件句柄

);

 

文件读写指针

我们读写文件时,往往都是直接从文件头开始读写,但有的时候我们打开一个旧的文件,我们想直接读到文件里的第几个数据,怎么处理呢,有一个函数可以设置文件的读写点,我们可以把它叫做读写指针。函数如下

DWORD SetFilePointer(

  HANDLE hFile,                // handle to file  文件句柄

  LONG lDistanceToMove,        // bytes to move pointer 要移动的字节数

  PLONG lpDistanceToMoveHigh,  // bytes to move pointer 高位,要移动的字节数

  DWORD dwMoveMethod           // starting point 从哪里开始移

);

参数说明

dwMoveMethod  从哪里开始移:

FILE_BEGIN,   从文件开始处开始移

FILE_CURRENT,   从当前位置开始向后移

FILE_END ,从文件最后向前移

操作实例

例子1、在当前目录下面创建一个文件:

HANDLE handle;   //声明一个文件句柄变量,用于保存打开的文件句柄

DWORD Num;  

handle= ::CreateFile("new.tmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,  

FILE_FLAG_DELETE_ON_CLOSE,NULL);   //在当前目录下创建一个new.tmp文件

if(INVALID_HANDLE_VALUE!= handle )   //判断创建文件是否成功

 

 ::SetFilePointer(handle,0,0,FILE_BEGIN);   //创建成功后,移动当前文件指针到文件开头处

 char Buffer[] = "这是个刚创建的文件";    //声明一个要写的文件数据

 ::WriteFile(handle,Buffer,sizeof(Buffer),&Num,NULL);   //写文件

 ZeroMemory(Buffer,sizeof(Buffer));   //清空Buffer变量

 ::SetFilePointer(handle,0,0,FILE_BEGIN);   写完数据后,当指文件指针为移动,下面我们要读出刚才写的数据,所以我们要把文件指针移到文件开始处

 ::ReadFile(handle,Buffer,sizeof(Buffer),&Num,NULL);   //读出刚才写的文件数据

 MessageBox(Buffer);   //把读出来的数据弹出来。

 ::CloseHandle(handle);    //关闭文件。

 

 

可以改变上面的创建文件的属性和操作看下不同效果。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有