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)/目录/文件/文件的查找的主要内容,如果未能解决你的问题,请参考以下文章

LVM逻辑卷创建管理

docker 学习

win32day04-Win32消息机制

如何设置蓝牙媒体卷的值

win32day03-窗口注册和创建

docker compose 卷类型 - 绑定与卷