Win32_文件系统
一 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的长度 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,//可用的空余字节数 PULARGE_INTEGER lpTotalNumberOfBytes,//全部的字节数 PULARGE_INTEGER lpTotalNumberOfFreeBytes//空余的字节数 );
4.2 簇
文件系统是通过簇管理硬盘,每个簇是由连续的几个扇区组成,如:1/2/4/8/16
扇区构成一个簇
常见的文件系统和簇的大小
FAT32 文件系统 1 个簇 = 8K字节
NTFS 文件系统 1 个簇 = 4K字节
簇是文件系统存放文件数据的最小单位,即使文件只有一个字节也需要占用一个簇
5 修改卷的名称
BOOL SetVolumeLabel( LPCTSTR lpRootPathName,//盘符 LPCTSTR lpVolumeName //新名称 );
1 #include "stdafx.h" 2 #include "windows.h" 3 4 void ShowSpace(LPSTR pszDrive) 5 { 6 //获取盘的大小 7 DWORD nSecPerCluster = 0; 8 DWORD nBytesPerSector = 0; 9 DWORD nFreeClusters = 0; 10 DWORD nTotalclusters = 0; 11 GetDiskFreeSpace(pszDrive,&nSecPerCluster,&nBytesPerSector, 12 &nFreeClusters,&nTotalclusters); 13 printf("\t SecCluster = %d BytesSector = %d FreeClusters = %d TotalClusters = %d\n", 14 nSecPerCluster,nBytesPerSector,nFreeClusters,nTotalclusters); 15 //获取大小 16 UINT64 nFreeAvailable = 0; 17 UINT64 nTotalBytes = 0; 18 UINT64 nFreeBytes = 0; 19 GetDiskFreeSpaceEx(pszDrive,(PULARGE_INTEGER)&nFreeAvailable, 20 (PULARGE_INTEGER)&nTotalBytes,(PULARGE_INTEGER)&nFreeBytes); 21 printf("FreeAvailable = %I64d Total = %I64d Free = %I64d\n", 22 nFreeAvailable >> 20,nTotalBytes >> 20,nFreeBytes >> 20); 23 24 } 25 void ShowVolumneInfo(LPSTR pszDrive) 26 { 27 CHAR szVolumneName[260] = {0}; 28 DWORD nVolumneSerial = 0; 29 DWORD nMaxLength = 0; 30 DWORD nFileSystem = 0; 31 CHAR szFileSystem[260] = {0}; 32 //获取卷信息 33 GetVolumeInformation(pszDrive,szVolumneName,260,&nVolumneSerial, 34 &nMaxLength,&nFileSystem,szFileSystem,260); 35 printf("\tName = %s Serial = %08X Length = %d FileSystem = %08X %s\n", 36 szVolumneName,nVolumneSerial,nMaxLength,nFileSystem,szFileSystem); 37 } 38 void ShowType(LPSTR pszDrive) 39 { 40 //获取盘的类型 41 UINT nType = GetDriveType(pszDrive); 42 switch(nType) 43 { 44 case DRIVE_FIXED: 45 printf("硬盘\n"); 46 break; 47 case DRIVE_CDROM: 48 printf("光驱\n"); 49 break; 50 } 51 } 52 void ShowVolumn() 53 { 54 //获取系统卷的位的标识 55 DWORD nDrives = GetLogicalDrives(); 56 printf("Drives:%08X\n",nDrives); 57 //获取系统卷的所有盘符 58 CHAR szText[260] = {0}; 59 GetLogicalDriveStrings(260,szText); 60 //输出盘符 61 CHAR *pszTmp = szText; 62 while(0 != pszTmp[0]) 63 { 64 printf("Drives:%s\n",pszTmp); 65 ShowSpace(pszTmp); 66 ShowType(pszTmp); 67 ShowVolumneInfo(pszTmp); 68 pszTmp = strlen(pszTmp) + 1 + pszTmp; 69 } 70 71 } 72 73 int main(int argc, char* argv[]) 74 { 75 //SetVolumeLabel("C:\\","SYSTEM"); //修改卷名称 76 ShowVolumn(); 77 return 0; 78 }
二 目录
1 系统和当前目录
1.1 获取Windows目录(Windows)
UINT GetWindowsDirectory( LPTSTR lpBuffer,//BUFF的地址 UINT uSize);//BUFF的长度
例如:C:\Windows
1.2 获取 System 目录(System32)
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);//新名称
1 #include "stdafx.h" 2 #include "windows.h" 3 4 5 void UseDirectory() 6 { 7 8 CreateDirectory("C:\\test",NULL);//创建目录 9 10 RemoveDirectory("C:\\test2");//删除目录,目录必须为空 11 12 MoveFile("C:\\test","C:\\test3");//修改目录名称 13 } 14 void ShowDirectory() 15 { 16 //获取Windows目录 17 CHAR szWindow[MAX_PATH] = {0}; 18 GetWindowsDirectory(szWindow,MAX_PATH); 19 printf("WindowsDirectory: %s\n",szWindow); 20 //获取System目录 21 CHAR szSystem[MAX_PATH] = {0}; 22 GetSystemDirectory(szSystem,MAX_PATH); 23 printf("System Directory:%s\n",szSystem); 24 //获取临时文件的路径 25 CHAR szTemp[MAX_PATH] = {0}; 26 GetTempPath(MAX_PATH,szTemp); 27 printf("Temp Path: %s\n",szTemp); 28 //获取程序的当前目录 29 CHAR szCurrent[MAX_PATH] = {0}; 30 GetCurrentDirectory(MAX_PATH,szCurrent); 31 printf("Current Directory:%s\n",szCurrent); 32 //设置当前目录 33 SetCurrentDirectory("C:\\"); 34 GetCurrentDirectory(MAX_PATH,szCurrent); 35 printf("Current Directory:%s\n",szCurrent); 36 } 37 38 int main(int argc, char* argv[]) 39 { 40 ShowDirectory(); 41 return 0; 42 }
三 文件
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,//偏移量,高32位 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( GET_FILEEX_INFO_LEVELS fInfoLevelId,//获取文件属性信息级别 LPVOID lpFileInformation);//对应级别的数据结构的地址
9.3 设置文件属性
BOOL SetFileAttributes( LPCTSTR lpFileName,//文件名 DWORD dwFileAttributes);//属性标示
1 #include "stdafx.h" 2 #include "stdlib.h" 3 #include "windows.h" 4 5 void Create() 6 { 7 //创建文件 8 HANDLE hFile = CreateFile("C:\\file.txt",GENERIC_READ | GENERIC_WRITE, 9 0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 10 //关闭文件 11 CloseHandle(hFile); 12 } 13 14 void Write() 15 { 16 //打开文件 17 HANDLE hFile = CreateFile("C:\\file.txt",GENERIC_WRITE,0,NULL, 18 OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 19 //写入数据 20 CHAR szBuff[] = "Hello File"; 21 DWORD nWritten = 0; 22 WriteFile(hFile,szBuff,strlen(szBuff),&nWritten,NULL); 23 //关闭文件 24 CloseHandle(hFile); 25 } 26 void Read() 27 { 28 //打开文件 29 HANDLE hFile = CreateFile("C:\\file.txt",GENERIC_READ,0,NULL, 30 OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 31 32 //获取文件长度 33 DWORD nHigh = 0; 34 DWORD nLow = GetFileSize(hFile,&nHigh); 35 //分配空间 36 LPSTR pszBuf = (LPSTR) malloc(nLow + 1); 37 memset(pszBuf,0,nLow + 1); 38 //设置当前读取位置 39 SetFilePointer(hFile,1,NULL,FILE_BEGIN); 40 //读取数据 41 DWORD nRead = 0; 42 ReadFile(hFile,pszBuf,nLow + 1,&nRead,NULL); 43 44 printf("%s\n",pszBuf); 45 free(pszBuf); 46 //关闭文件 47 CloseHandle(hFile); 48 } 49 50 void Operate() 51 { 52 // 拷贝文件 53 CopyFile("C:\\file.txt","C:\\file1.txt",FALSE); 54 //删除文件 55 DeleteFile("C:\\file.txt"); 56 } 57 58 /********************************************* 59 * 函 数:PrintFileTime() 60 * 功 能:把文件时间转换为系统时间 61 **********************************************/ 62 63 void PrintFileTime(LPSTR pszName,LPFILETIME pFileItem) 64 { 65 //将文件时间转换为本时区的时间 66 FileTimeToLocalFileTime(pFileItem,pFileItem); 67 //将文件时间转换为系统时间 68 SYSTEMTIME systime = {0}; 69 FileTimeToSystemTime(pFileItem,&systime); 70 printf("%s:%d-%d-%d %d:%d:%d\n",pszName,systime.wYear, 71 systime.wMonth,systime.wDay,systime.wHour, 72 systime.wMinute,systime.wSecond); 73 } 74 75 void Attri() 76 { 77 //获取文件属性 78 DWORD nAttri = GetFileAttributes("C:\\file1.txt"); 79 printf("nAttri = %08X\n",nAttri); 80 //获取文件的属性和信息 81 WIN32_FILE_ATTRIBUTE_DATA data = {0}; 82 GetFileAttributesEx("C:\\file1.txt",GetFileExInfoStandard,&data); 83 printf("Attri = %d\n",data.dwFileAttributes); 84 printf("SizeHigh = %d\n",data.nFileSizeHigh); 85 printf("SizeLow = %d\n",data.nFileSizeLow); 86 87 PrintFileTime("CreationTime",&data.ftCreationTime); 88 PrintFileTime("LastAccessTime",&data.ftCreationTime); 89 PrintFileTime("LastWriteTime",&data.ftLastWriteTime); 90 } 91 int main(int argc, char* argv[]) 92 { 93 Create(); 94 Write(); 95 Read(); 96 Operate(); 97 Attri(); 98 return 0; 99 }
四 文件的查找
1 查找文件
BOOL FindFirstFile( LPCTSTR lpFileName,//查找的路径 LPWIN32_FIND_DATA lpFindFileData)//返回查找信息
返回值 - 查找句柄
2 获取查找到的结果
BOOL FindNextFile( HANDLE hFindFile,//查找句柄 LPWIN32_FIND_DATA lpFindFileData);//返回查找信息
返回值 - 成功:TRUE
3 关闭查找
BOOL FindClose(HANDLE hFindFile);//查找句柄
4 关于查找结果排序,需要自己增加排序功能
1 #include "stdafx.h" 2 #include "windows.h" 3 4 void Find( LPSTR pszPath, LPSTR pszType ) 5 { 6 CHAR szFind[MAX_PATH] = { 0 }; 7 sprintf( szFind, "%s%s", pszPath, pszType ); 8 //开始查找 9 WIN32_FIND_DATA find = { 0 }; 10 HANDLE hFind = FindFirstFile( 11 szFind, &find ); 12 //显示查找结果 13 BOOL bRet = TRUE; 14 while( TRUE == bRet ) 15 { 16 if( find.dwFileAttributes & 17 FILE_ATTRIBUTE_DIRECTORY ) 18 { 19 printf( "+[%s]\n", find.cFileName ); 20 if( find.cFileName[0] != '.' ) 21 { //构造下一层目录的路径 22 CHAR szNextPath[MAX_PATH] = { 0 }; 23 sprintf( szNextPath, 24 "%s%s\\", pszPath, find.cFileName ); 25 //搜索下一层目录 26 Find( szNextPath, pszType ); 27 } 28 } 29 else 30 { 31 //printf( "-%s\n", find.cFileName ); 32 } 33 34 bRet = FindNextFile( hFind, &find ); 35 } 36 //关闭 37 FindClose( hFind ); 38 } 39 40 int main(int argc, char* argv[]) 41 { 42 Find( "C:\\windows\\", "*.*" ); 43 return 0; 44 }