volcanol的工控博客
Email : lilinly225@126.com 索要资料加QQ 点击进入 或 点击左侧的资料分享专用帖

volcanol ---- View OF Linux Can Appreciate Nature OF Linux

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  如果说计算机系统中有一个具有代表性的概念,那么就是文件了。从虚拟和广义的角度上讲Unix将系统的各种资源都看做文件;同样

目前蒸蒸日上的Linux系统也将系统中的各种资源看做文件,而占有PC机霸主地位的Win平台也将系统资源看做文件。

1、文件的概念

  文件: 存储在外存储设备上的一段数据的集合,这段数据用一个文件名标示符标志。例如C语言源代码在各种平台下都存储为一块

ASCII码的数据集合。

     在Windows下,系统不但将通常意义下的“文件”看做文件;而且将磁盘设备、通信资源、命名管道、控制台输入和输出等均看做文件。

从虚拟或者广义的角度上来看,系统是由文件构成的。(CPU也可以看成是“文件”的一种)。

  win32 API文件操作函数给应用程序提供了一整套的操作各种类型文件的接口,通过这些接口可以方便的访问文件。

2、 创建和打开文件

  Win32中使用CreateFile函数来创建和打开所有类型的文件;应用程序可以通过设置不同的模式来从文件中读入、写入

或者读写文件中的内容。还可以指定是否可以共享文件,以读取、写入或者读写文件。

  通过CreateFile函数操作文件的时候,会返回一个文件句柄“HFILE”;

     CreateFile函数的原型是:

  HANDLE   CreateFile( LPCTSTR lpFileName,      //文件名,通常包含路径

                                      DWORD dwDesiredAccess,  //访问文件的存取模式

                                      DWORD dwShareMode,   //共享的模式

                                      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指定文件的安全属性

                                      DWORD dwCreationDisposition, //创建文件的模式

                                      DWORD dwFlagstaffAndAttributes,// 指定新建文件的属性和标志

                                      HANDLE hTemplateFile  //指向一个具有GENERIC_READ属性的文件句柄,该文件为要创建的文件

                                                                        //提供文件属性和文件扩展属性

                                    );

Exp_1:

__________________________________________________

    typedef HANDLE HFILE;

  HFILE hFile;

      hFile=CreateFile(L"createfile.txt",    

                             GENERIC_READ |GENRIC_WRITE,

                             FILE_SHARE_READ,

                             NULL,

                             OPEN_ALWAYS,

                             FILE_ATTRIBUTE_NORMAL,

                             NULL

                             );

___________________________________________________

  windows为创建或者打开的文件指定一个文件句柄,应用程序如果需要读写文件,需要给读写文件的API函数提供这个文件句柄hFile;

在使用hFile之前通常建议检查其有效性,就像Exp_2;当文件读写完毕建议使用CloseHandle函数关闭打开的文件,这将关闭文件并且

刷新缓冲区。 

  应用程序可以打开用于控制台输入和输出的文件句柄,当应用程序把“CONIN$”传递给CreateFile时则打开的文件用于控制台输入;而

将“CONOUT$”传递给CreateFile时,则打开的文件用于输出。 这样就会返回标准输入、输出设备的文件句柄;可以通过SetStdHandle函

数重定向标准输入和输出句柄。 可以使用GetStdHandle函数来检索标准输入、输出和错误处理程序。这些函数允许应用程序使用标准文件

句柄和重定向标准输入输出文件。

Exp_2:

  if(hFile != INVALID_FILE_VALUE)

      {

              //这里对文件进行读写操作

              ......

              //操作完后关闭文件

      CloseHandle(hFile);

       }

_________________________________________________________________

Exp_3:  调用Win32对标准输入和输出进行操作

        HFILE hFileStdIn;

   char StdInBuf[128];

   DWORD dwRead;

     dwRead=0;

        hFileStdIn=CreateFile("CONIN$",

                                        GENERIC_READ,

                                         0,

                                         NULL,

               OPEN_EXISTING,

                                        FILE_ATTRIBUTE_READ,

                                        NULL

                                      );

             if(hFileStdIn != FILE_INVALID_VALUE)

              {

       SetFilePointer(hFileStdIn,0,0,FILE_BEGIN);

                    ReadFile(hFileStdIn,StdInBuf,1,&dwRead,NULL);   //从标准输入读取一个字符,相当于getc

                    StdInBuf[dwRead]='\0';

                    CloseFile(hFileStdIn);

              }

  如果查看CRuntime库,那么可以发现getc这样的输入和输出函数,是通过调用系统的API实现输入和输出的。

3、文件指针

  当某个文件在应用程序里面被第一次打开时,Windows在文件的起始位置设定一个文件指针。文件指针指示下一次读、写

操作的位置,随着文件的读取和写入,widnows将动态调整这个文件指针,应用程序也可以用SetFilePointer函数来移动文件指

针指向的位置。

     应用程序通过调用Win32函数ReadFile和WriteFile来对文件进行读、写操作;这些函数的操作在文件指针指示的位置处进行读

、写给定数量的字节数,但是不对数据进行格式化。 

     ReadFile见Exp_3;

     SetFilePointer见Exp_3;

Exp_4:

------------------------------------------------------------------------------------------------

        HFILE hFileStdOut;

   char StdOutBuf[128]=“Hello word!”;

        unsigend int StrLen;

   DWORD dwWrite;

     dwWrite=0;

         StrLen=strlen(StdOutBuf);

        hFileStdOut=CreateFile("CONout$",

                                        GENERIC_WRITE,

                                         0,

                                         NULL,

               OPEN_EXISTING,

                                        FILE_ATTRIBUTE_WRITE,

                                        NULL

                                      );

             if(hFileStdIn != FILE_INVALID_VALUE)

              {

       SetFilePointer(hFileStdOut,0,0,FILE_BEGIN);  //实际上如果是第一打开的话,可以不进行定位

                    WriteFile(hFileStdIn,StdOutBuf,StrLen,&dwWrite,NULL);   

                    CloseFile(hFileStdOut);

              }

 

4、锁定文件和解锁文件

  在Windows平台下可能同时又两个应用程序打开一个文件,这时为了防止两个应用程序对同一个文件的同一个区域进行

读写,可以使用LockFile函数进行文件锁定,以防止文件被多应用程序修改。

  对文件的访问结束后,可以通过UnlockFile函数对锁定的文件进行解锁。      

 

 

 

 

              

posted on 2012-03-03 01:31  volcanol  阅读(926)  评论(0编辑  收藏  举报
volcanol ----View OF Linux Can Appreciate Nature OF Linux。