• Windows程序设计零基础自学_14_Windows文件和目录操作


      如果说计算机系统中有一个具有代表性的概念,那么就是文件了。从虚拟和广义的角度上讲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函数对锁定的文件进行解锁。      

                  

  • 相关阅读:
    xUtils 中的BitmapUtils 全面注释
    321影音代码
    android studio使用技巧
    java android面试题分析总结
    android面试题分析总结
    据说年薪30万的Android程序员必须知道的帖子
    好用软件
    win10找回win7的windows照片查看器
    github上传代码
    android 常见错误集锦
  • 原文地址:https://www.cnblogs.com/volcanol/p/2377958.html
Copyright © 2020-2023  润新知