【win32】day12-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;
}






  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值