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);//新名称
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 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); //新名称
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 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 ); //属性标示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 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 关于查找结果排序,需要自己增加排序功能。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 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; }