• Win32编程day12 学习笔记


    一 Windows卷(Volumn)

      1 卷的获取
        GetLogicalDrives 返回一个DWORD值,这个值的每个位代表是否存在相应的卷
        GetLogicalDriveStrings 获取一个所有卷的盘符的字符串

          DWORD GetLogicalDriveStrings(
              DWORD nBufferLength,//BUFF的大小
              LPTSTR lpBuffer );//BUFF的指针

        BUFF存放数据的格式:
          A:\ + 0 + C:\ + 0 ... + 0
        Windows的盘符从A-Z
       
      2 卷的类型

        UINT GetDriveType(
              LPCTSTR lpRootPathName );//盘符

      返回盘的类型   
     
      3 卷的信息

        BOOL GetVolumeInformation(
              LPCTSTR lpRootPathName, //盘符
          LPTSTR lpVolumeNameBuffer, //存放卷标的BUFF
          DWORD nVolumeNameSize,//存放卷标的BUFF的长度 length of lpVolumeNameBuffer
          LPDWORD lpVolumeSerialNumber,//卷的序列号
          LPDWORD lpMaximumComponentLength,//路径最大的字符串的长度
          LPDWORD lpFileSystemFlags,//文件系统的标识
          LPTSTR lpFileSystemNameBuffer,//存放文件系统的名称的BUFF
          DWORD nFileSystemNameSize );//文件系统的BUFF的长度

       4 卷的大小
         4.1 获取指定卷的大小
         GetDiskFreeSpace  - 2G以下使用

          BOOL GetDiskFreeSpace(
           LPCTSTR lpRootPathName,//盘符
           LPDWORD lpSectorsPerCluster, //每个簇包含的扇区
           LPDWORD lpBytesPerSector,//每个扇区的字节数
           LPDWORD lpNumberOfFreeClusters, //空余簇的数量
           LPDWORD lpTotalNumberOfClusters  ); //总共的簇的数量

         GetDiskFreeSpaceEx- 不限制

           BOOL GetDiskFreeSpaceEx(
                LPCTSTR lpDirectoryName, //盘符
            PULARGE_INTEGER lpFreeBytesAvailableToCaller, // receives the number of bytes on
                     //可用的空余字节数
            PULARGE_INTEGER lpTotalNumberOfBytes,
               //全部的字节数
            PULARGE_INTEGER lpTotalNumberOfFreeBytes
            );     //空余的字节数

        4.2 簇
       文件系统是通过簇管理硬盘,每个簇是由连续的几个扇区组成. 例如:1/2/4/8/16/32扇区构成1个簇.
       常见的文件系统和簇的大小,例如:
          FAT32文件系统 1个簇=8K字节
          NTFS 文件系统 1个簇=4K字节
       簇是文件系统存放文件数据的最小单位.
       即使文件只有1个字节也需要占用1个簇.
     5 修改卷的名称

          BOOL SetVolumeLabel(
         LPCTSTR lpRootPathName,//盘符
         LPCTSTR lpVolumeName);//新名称
    View Code
    // WinVolumn.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "windows.h"
    
    void ShowSpace( LPSTR pszDrive )
    {   //获取盘的大小
        DWORD nSecPerCluster = 0;
        DWORD nBytesPerSector= 0;
        DWORD nFreeClusters  = 0;
        DWORD nTotalClusters = 0;
        GetDiskFreeSpace( pszDrive, 
            &nSecPerCluster, &nBytesPerSector, 
            &nFreeClusters, &nTotalClusters );
        printf(
            "\tSecCluster=%d BytesSector=%d "
            "FreeClusters=%d TotalClusters=%d\n",
            nSecPerCluster, nBytesPerSector, 
            nFreeClusters, nTotalClusters );
        //获取大小
        UINT64 nFreeAvailable = 0;
        UINT64 nTotalBytes    = 0;
        UINT64 nFreeBytes     = 0;
        GetDiskFreeSpaceEx( pszDrive, 
            (PULARGE_INTEGER)&nFreeAvailable,
            (PULARGE_INTEGER)&nTotalBytes, 
            (PULARGE_INTEGER)&nFreeBytes );
        printf( "\tFreeAvailable=%I64d Total=%I64d Free=%I64d\n",
            nFreeAvailable>>30, nTotalBytes>>30,
            nFreeBytes>>30 );
    }
    
    void ShowVolumneInfo( LPSTR pszDrive )
    {
        CHAR  szVolumneName[260] = { 0 };
        DWORD nVolumneSerial     = 0;
        DWORD nMaxLength         = 0;
        DWORD nFileSystem        = 0;
        CHAR  szFileSystem[260]  = { 0 };
        //获取卷信息
        GetVolumeInformation( pszDrive,
            szVolumneName, 260, &nVolumneSerial,
            &nMaxLength, &nFileSystem, 
            szFileSystem, 260 );
        printf(
            "\tName=%s Serial=%08X Length=%d FileSystem=%08X %s\n",
            szVolumneName, nVolumneSerial,
            nMaxLength, nFileSystem, szFileSystem );
    }
    
    void ShowType( LPSTR pszDrive )
    {    //获取盘的类型
        UINT nType = GetDriveType( pszDrive );
        switch( nType )
        {
        case DRIVE_REMOVABLE:
            printf( "\t移动\n" );
            break;
        case DRIVE_FIXED:
            printf( "\t硬盘\n" );
            break;
        case DRIVE_CDROM:
            printf( "\t光驱\n" );
            break;
        }
    }
    
    void ShowVolumn( )
    {    //获取系统卷的位的标识
        DWORD nDrives = GetLogicalDrives( );
        printf( "Drives: %08X\n", nDrives );
        //获取系统卷的所有盘符
        CHAR szText[260] = { 0 };
        GetLogicalDriveStrings( 260, szText );
        //输出盘符
        CHAR * pszTmp = szText;
        while( 0 != pszTmp[0] )
        {
            printf( "Drives: %s\n", pszTmp );
            ShowType( pszTmp );
            ShowVolumneInfo( pszTmp );
            ShowSpace( pszTmp );
            pszTmp = strlen(pszTmp) + 1 + pszTmp;
        }
    }
    
    int main(int argc, char* argv[])
    {
        //SetVolumeLabel( "C:\\", "SYSTEM" );
        ShowVolumn( );
        return 0;
    }

    二 目录
      1 系统和当前目录
        1.1 获取Windows目录

        UINT GetWindowsDirectory(
              LPTSTR lpBuffer,//BUFF的地址
              UINT uSize ); //BUFF的长度

        例如: C:\Windows
        1.2 获取System目录

        UINT GetSystemDirectory(
              LPTSTR lpBuffer,  //BUFF的地址
              UINT uSize ); //BUFF的长度

        例如: C:\Windows\System32
       1.3 获取临时文件的路径

        DWORD GetTempPath(
           DWORD nBufferLength,//BUFF的长度
           LPTSTR lpBuffer);    //BUFF的地址

        1.4 当前目录
          应用程序当前正在使用的默认目录获取

           DWORD GetCurrentDirectory(
               DWORD nBufferLength,  //BUFF的长度
           LPTSTR lpBuffer); //BUFF的地址

          设置

            BOOL SetCurrentDirectory(
                  LPCTSTR lpPathName); //新的当前目录

      2 目录的使用
        2.1 创建目录

           BOOL CreateDirectory(
                  LPCTSTR lpPathName,//创建的目录的路径
           LPSECURITY_ATTRIBUTES lpSecurityAttributes );安全属性

        2.2 删除目录

           BOOL RemoveDirectory(
                  LPCTSTR lpPathName );//删除的目录的路径

         要删除目录中不能包含其它文件等,只能是空目录.
        2.3 修改目录名称

           BOOL MoveFile(
             LPCTSTR lpExistingFileName, //旧名称
           LPCTSTR lpNewFileName); //新名称
    View Code
    // WinDirectory.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "windows.h"
    
    void UseDirectory( )
    {    //创建目录
        CreateDirectory( "C:\\test", NULL );
        //删除目录
        RemoveDirectory( "C:\\test2" );
        //修改目录名称
        MoveFile( "C:\\test", "C:\\test3" );
    }
    
    void ShowDirectory( )
    {
        //获取Windows目录
        CHAR szWindow[MAX_PATH] = { 0 };
        GetWindowsDirectory( szWindow,
            MAX_PATH );
        printf( "Windows Directory: %s\n", szWindow );
        //获取System目录
        CHAR szSystem[MAX_PATH] = { 0 };
        GetSystemDirectory( szSystem,
            MAX_PATH );
        printf( "System Directory: %s\n", szSystem );
        //获取临时文件的路径
        CHAR szTemp[MAX_PATH] = { 0 };
        GetTempPath( MAX_PATH, szTemp );
        printf( "Temp Path: %s\n", szTemp );
        //获取程序的当前目录
        CHAR szCurrent[MAX_PATH] = { 0 };
        GetCurrentDirectory( MAX_PATH, szCurrent );
        printf( "Current Directory: %s\n", szCurrent );
        //设置当前目录
        SetCurrentDirectory( "C:\\" );
        GetCurrentDirectory( MAX_PATH, szCurrent );
        printf( "Current Directory: %s\n", szCurrent );
    }
    
    int main(int argc, char* argv[])
    {
        ShowDirectory( );
        UseDirectory( );
        return 0;
    }

    三 文件

      1 文件的创建或打开

        HANDLE CreateFile(
          LPCTSTR lpFileName,//文件路径和名称
          DWORD dwDesiredAccess, //访问方式
          DWORD dwShareMode,//共享模式
          LPSECURITY_ATTRIBUTES lpSecurityAttributes,//安全属性
          DWORD dwCreationDisposition,  //创建方式
          DWORD dwFlagsAndAttributes,//文件属性
          HANDLE hTemplateFile );//拷贝的文件句柄

      2 文件的关闭

        BOOL CloseHandle(
          HANDLE hObject );//要关闭的句柄

      3 文件的数据写入

        BOOL WriteFile(
         HANDLE hFile, //文件句柄
       LPCVOID lpBuffer, //写入数据的BUFF的地址
       DWORD nNumberOfBytesToWrite,//写入数据的BUFF的长度
       LPDWORD lpNumberOfBytesWritten, //返回被写入数据的长度
       LPOVERLAPPED lpOverlapped);//默认NULL

      4 文件的数据读取

        BOOL ReadFile(
          HANDLE hFile, // 文件句柄
          LPVOID lpBuffer, //读入数据的BUFF的地址
          DWORD nNumberOfBytesToRead,//读入数据的BUFF的长度
          LPDWORD lpNumberOfBytesRead,//返回被读入数据的长度
          LPOVERLAPPED lpOverlapped );//默认NULL

      5 获取文件长度 

        DWORD GetFileSize(
              HANDLE hFile,//文件的句柄
        LPDWORD lpFileSizeHigh );//高32位

        返回值是低32位
        文件的长度64位 = (低32位, 高32位 )

      6 设置文件指针

       DWORD SetFilePointer(
          HANDLE hFile, //文件的句柄
          LONG lDistanceToMove, //偏移量,低32位 
          PLONG lpDistanceToMoveHigh, //偏移量,高
          DWORD dwMoveMethod ); //相对位置

      返回值是返回偏移量的低32

      7 拷贝文件

       BOOL CopyFile(
        LPCTSTR lpExistingFileName,//
       LPCTSTR lpNewFileName,  //目的
       BOOL bFailIfExists );//是否覆盖目的同名文件,FALSE为覆盖

      8 删除文件

        BOOL DeleteFile(
        LPCTSTR lpFileName );//要删除的文件

     9 文件的属性
      9.1 GetFileAttributes

         DWORD GetFileAttributes(
          LPCTSTR lpFileName );文件名

      返回值是获取到的文件的属性标示
       9.2 GetFileAttributesEx

         BOOL GetFileAttributesEx(
          LPCTSTR lpFileName,//文件名
          GET_FILEEX_INFO_LEVELS fInfoLevelId,  //获取文件属性信息的级别
        LPVOID lpFileInformation  //对应级别的数据结构的地址
       );

        9.3 设置文件属性

         BOOL SetFileAttributes(
         LPCTSTR lpFileName,  //文件名 pointer to filename
        DWORD dwFileAttributes  ); //属性标示
    View Code
    // WinFile.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "stdlib.h"
    #include "windows.h"
    
    void Create( )
    {    //创建文件
        HANDLE hFile = CreateFile( 
            "C:\\file.txt",
            GENERIC_READ|GENERIC_WRITE,
            0,
            NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL );
        //关闭文件
        CloseHandle( hFile );
    }
    
    void Write( )
    {    //打开文件
        HANDLE hFile = CreateFile( 
            "C:\\file.txt",
            GENERIC_WRITE,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL );
        //写入数据
        CHAR szBuff[]  = "Hello File";
        DWORD nWritten = 0;
        WriteFile( hFile, szBuff, strlen(szBuff),
            &nWritten, NULL );
        //关闭文件
        CloseHandle( hFile );
    }
    
    void Read( )
    {    //打开文件
        HANDLE hFile = CreateFile(
            "C:\\file.txt",
            GENERIC_READ,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL );
        //获取文件长度
        DWORD nHigh = 0;
        DWORD nLow  = GetFileSize( hFile, &nHigh );
    
        //分配空间
        LPSTR pszBuf = (LPSTR)malloc( nLow + 1 );
        memset( pszBuf, 0, nLow + 1 );
        //设置当前读取的位置
        SetFilePointer( hFile, 1, NULL, FILE_BEGIN );
        //读取数据
        DWORD nRead = 0;
        ReadFile( hFile, pszBuf, nLow+1, 
            &nRead, NULL );
        printf( "%s", pszBuf );
        free( pszBuf );
        //关闭文件
        CloseHandle( hFile );
    }
    
    void Operate( )
    {    //拷贝文件
        CopyFile( "C:\\file.txt",
            "C:\\file1.txt", FALSE );
        //删除文件
        DeleteFile( "C:\\file.txt" );
    }
    
    void PrintFileTime( LPSTR pszName,
                        LPFILETIME pFileItem )
    {    //将文件时间转换本时区的时间
        FileTimeToLocalFileTime( 
            pFileItem, pFileItem );
        //将文件时间转换为系统时间
        SYSTEMTIME systime = { 0 };
        FileTimeToSystemTime( pFileItem,
            &systime );
        printf( "%s: %d-%d-%d %d:%d:%d\n",
            pszName, systime.wYear, systime.wMonth,
            systime.wDay, systime.wHour,
            systime.wMinute, systime.wSecond );
    }
    
    void Attri( )
    {
        //获取文件的属性
        DWORD nAttri = 
            GetFileAttributes( "C:\\file1.txt" );
        printf( "nAttri = %08X\n", nAttri );
        //获取文件的属性和信息
        WIN32_FILE_ATTRIBUTE_DATA data = { 0 };
        GetFileAttributesEx( "C:\\file1.txt",
            GetFileExInfoStandard, &data );
        printf( "Attri=%d\n",data.dwFileAttributes );
        printf( "SizeHigh=%d\n",data.nFileSizeHigh );
        printf( "SizeLow=%d\n",data.nFileSizeLow );
        PrintFileTime( "CreationTime", 
            &data.ftCreationTime );
        PrintFileTime( "LastAccessTime", 
            &data.ftLastAccessTime );
        PrintFileTime( "LastWriteTime", 
            &data.ftLastWriteTime );
    } 
    
    int main(int argc, char* argv[])
    {
        Create( );
        Write( );
        Read( );
        Operate( );
        Attri( );
        return 0;
    }  

    四 文件的查找
     
     1 查找文件

         HANDLE FindFirstFile(
         LPCTSTR lpFileName,//查找的路径
       LPWIN32_FIND_DATA lpFindFileData //返回查找信息
      );

      返回值 - 查找句柄
     2 获取查找到的结果

          BOOL FindNextFile(
         HANDLE hFindFile,  //查找句柄
        LPWIN32_FIND_DATA lpFindFileData  //返回查找信息
        );

        返回值 - 成功是TRUE
     3 关闭查找

        BOOL FindClose(
         HANDLE hFindFile   //查找句柄
        );

      4 关于查找结果排序,需要自己增加排序功能。

    View Code
    // WinFind.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "windows.h"
    
    void Find( LPSTR pszPath, LPSTR pszType )
    {    
        CHAR szFind[MAX_PATH] = { 0 };
        sprintf( szFind, "%s%s", pszPath, pszType );
        //开始查找
        WIN32_FIND_DATA find = { 0 };
        HANDLE hFind = FindFirstFile( 
            szFind, &find );
        //显示查找结果
        BOOL bRet = TRUE;
        while( TRUE == bRet )
        {
            if( find.dwFileAttributes &
                FILE_ATTRIBUTE_DIRECTORY )
            {
                printf( "+[%s]\n", find.cFileName );
                if( find.cFileName[0] != '.' )
                {   //构造下一层目录的路径
                    CHAR szNextPath[MAX_PATH] = { 0 };
                    sprintf( szNextPath, 
                        "%s%s\\", pszPath, find.cFileName );
                    //搜索下一层目录
                    Find( szNextPath, pszType );
                }
            }
            else
            {
                //printf( "-%s\n", find.cFileName );
            }
    
            bRet = FindNextFile( hFind, &find );
        }
        //关闭
        FindClose( hFind );
    }
    
    int main(int argc, char* argv[])
    {
        Find( "C:\\windows\\", "*.*" );
        return 0;
    }
  • 相关阅读:
    @loj
    @hdu
    @hdu
    转:sql之left join、right join、inner join的区别
    MySQL客户端Workbench
    转:js中this关键字详解
    转:jQuery弹出二级菜单
    转:ASP.NET 使用Ajax
    Python类的特点 (3) :静态方法与类方法
    Python类的特点 (2) :类属性与实例属性的关系
  • 原文地址:https://www.cnblogs.com/tangzhengyue/p/2646932.html
Copyright © 2020-2023  润新知