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;
}

 

posted @ 2012-08-19 23:45  唐小喵  阅读(482)  评论(0编辑  收藏  举报