win32day12-Windows卷(Volumn)/目录/文件/文件的查找
Posted 吴英强
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32day12-Windows卷(Volumn)/目录/文件/文件的查找相关的知识,希望对你有一定的参考价值。
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);//新名称
// 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); //新名称
// 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 ); //属性标示
// 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 关于查找结果排序,需要自己增加排序
功能。
// 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;
以上是关于win32day12-Windows卷(Volumn)/目录/文件/文件的查找的主要内容,如果未能解决你的问题,请参考以下文章