首页 > 代码库 > Windows文件系统

Windows文件系统



                                文件系统


windows

 1卷的获取

GetLogicalDrives() - 返回DWORD值,此值每位代表是否存在相应的卷

GetLogicalDriveStrings () - 获取所有卷盘符的字符串

DWORD GetLogicalDriveStrings(

DWORD nBufferLength,//buff 大小

LPTSTR  lpBuffer);//buff指针

Buff存放数据格式:

A:\ ++ B:\ + 0 + C:\ + 0 ….. + 00

Windows的盘符A-Z(最多26)


  2卷的类型

    UINGT GetDriveType(LPCTSTR lpRootPathName);//盘符

  3卷的信息

BOOL GetVolumeInformationW(

     LPCTSTR lpRootPathName,//盘符

     LPWSTR lpVolumeNameBuffer,///存放卷标的buff

     DWORD nVolumeNameSize,//存放卷标的buff长度

LPDWORD lpVolumeSerialNumber//卷的序列号,

     LPDWORD lpMaximumComponentLength,//路径最大字符串长度

     LPDWORD lpFileSystemFlags,//文件系统标识

     LPWSTR lpFileSystemNameBuffer,//文件系统名称buff

     DWORD nFileSystemNameSize//文件系统buff长度

    );

4卷的大小

GetDiskFreeSpace -获取指定卷的大小(2GB以下)

BOOL  GetDiskFreeSpaceA(

LPCSTR lpRootPathName,//盘符

    LPDWORD lpSectorsPerCluster,//每个簇包含的扇区

    LPDWORD lpBytesPerSector,//每个扇区的字节数

    LPDWORD lpNumberOfFreeClusters,//空余的簇的数量

    LPDWORD lpTotalNumberOfClusters );//总共簇的数量

     GetDiskFreeSpaceEx  - 获取指定卷的大小(不限制)

    GetDiskFreeSpaceExA(

            LPCSTR lpDirectoryName,//盘符

            PULARGE_INTEGER lpFreeBytesAvailableToCaller,//可用空余字节数

            PULARGE_INTEGER lpTotalNumberOfBytes,//全部字节数

            PULARGE_INTEGER lpTotalNumberOfFreeBytes);//空余字节数


 

文件系统通过簇管理硬盘,每个簇由连续的几个扇区组成。

例如:1/2/4/8/16/32扇区构成一个簇

常见文件系统和簇的大小

 FAT32  文件系统一个簇 = 8k字节

 NTFS 文件系统一个簇 = 4k字节

簇是文件系统存放文件数据的最小单位,即使文件只有1B也需占用一个簇的空间     

注意:簇的大小会根据磁盘大小变化,以上只是比较常见的簇大小


 5修改卷的名称

   SetVolumnLable(LPCTSTR lpRootPahtName,//盘符

                  LPCTSTR   lpVolumnName);//新名称

  示例代码:

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>


void showSpace(LPSTR pszDrive)
{
	DWORD nSectorPerCluster = 0;
	DWORD nBytesPerSector = 0;
	DWORD nFreeCluster = 0;
	DWORD nTotalCluster = 0;
	GetDiskFreeSpaceA(pszDrive, &nSectorPerCluster, &nBytesPerSector, &nFreeCluster, &nTotalCluster);
	printf("\tnSectorPerCluster = %d  nBytesPerSector = %d   nFreeCluster = %d  nTotalCluster = %d\n", nSectorPerCluster, nBytesPerSector, nFreeCluster, nTotalCluster);


	
	UINT64 nFreeBytesAvailableToCaller = 0;
	UINT64 nTotalNumberOfBytes = 0;
	UINT64 nTotalNumberOfFreeBytes = 0;
	GetDiskFreeSpaceExA(pszDrive, (PULARGE_INTEGER)&nFreeBytesAvailableToCaller, (PULARGE_INTEGER)&nTotalNumberOfBytes, (PULARGE_INTEGER)&nTotalNumberOfFreeBytes);

	printf("\t nFreeBytesAvailableToCaller = %I64dM  nTotalNumberOfBytes = %I64dM  nTotalNumberOfFreeBytes = %I64dM  \n", nFreeBytesAvailableToCaller>>20, nTotalNumberOfBytes>>20, nTotalNumberOfFreeBytes>>20);
}

void showType(LPSTR pszDrive)
{
	UINT nType = GetDriveTypeA(pszDrive);
	switch (nType)
	{
	case DRIVE_FIXED:
		printf("硬盘\n");
		break;
	case DRIVE_CDROM:
		printf("光驱\n");
		break;
	case DRIVE_REMOVABLE:
		printf("移动\n");
		break;

	}
}


void showVolumnInfo(LPSTR pszDrive)
{
	char szVolumnName[260] = { 0 };
	DWORD nVolumnSerial = 0;
	DWORD nMaxLength = 0;
	DWORD nFileSystem = 0;
	char szFileSystem[260] = { 0 };
	GetVolumeInformationA(pszDrive, szVolumnName, 260,
		                                             &nVolumnSerial, &nMaxLength,
													 &nFileSystem, szFileSystem, 260);

	printf("\tName = %s Serial = %08x Length = %d FileSystem = %08x   %s\n", szVolumnName, &nVolumnSerial, &nMaxLength,&nFileSystem, szFileSystem);
}
void showVolumn()
{
	//获取系统卷位的标识
	DWORD nDrivers = GetLogicalDrives();

	printf("Drivers: %08x\n", nDrivers);

	char szText[256];
	GetLogicalDriveStringsA(256,szText);

	//输出盘符
	char *pszTemp = szText;
	while (0 != pszTemp[0])
	{
		printf("Drivers:  %s\n", pszTemp);
		showType(pszTemp);
		showVolumnInfo(pszTemp);
		showSpace(pszTemp);
		pszTemp = strlen(pszTemp) + 1 + pszTemp;
	}
}


int main()
{
	showVolumn();

	//设置卷标
	//SetVolumeLabelA("C:\\", "System");
	return 0;
}

目录

 1系统目录和当前目录

   1.1获取系统目录

 

GetWindowsDirectory

UINT GetWindowsDirectoryA(

      LPSTR lpBuffer,//buff地址

      UINT uSize//buff长度

    );

  1.2获取System目录

GetSystemDirectory

UINT GetSystemDirectoryA (

      LPSTR lpBuffer,//buff地址

      UINT uSize//buff长度

    );

 

1.3获取临时文件路径

 

GetTempPath

 DWORD GetTempPathA(

DWORD nBufferLength,//buff长度

LPSTR lpBuffer//buff地址

);

   1.4当前目录

    获取应用程序当前正在使用的默认目录

GetCurrentDirectory

DWORD GetCurrentDirectoryA(

         DWORD nBufferLength,//buff长度

         LPSTR lpBuffer//buff地址

)

设置应用程序当前正在使用的默认目录;

GetCurrentDirectory

 

DWORD GetCurrentDirectoryA(

         LPSTR lpBuffer//buff地址

)

 2目录的使用

2.1创建目录

CreateDirectory

BOOL CreateDirectoryA(

         LPCSTR lpPathName,//创建目录的路径

         LPSECURITY_ATTRIBUTES lpSecurityAttributes//安全属性,默认为空

    );

2.2删除目录(要删除的目录中必须为空目录)

RemoveDirectory


2.4修改目录名称

MoveFile

BOOL MoveFileA(

        LPCSTR lpExistingFileName,//旧名称

        LPCSTR lpNewFileName//新名称

    );

 示例代码:

#include <Windows.h>
#include <stdio.h>

void useDirectory()
{
	//创建目录
	CreateDirectoryA("D:\\test", nullptr);

	//删除目录
	//RemoveDirectoryA("D:\\test");

	MoveFileA("D:\\test", "D:\\test1");
}



void showDirectory()
{
	//获取windows目录
	char szWindow[MAX_PATH] = { 0 };
	GetWindowsDirectoryA(szWindow, MAX_PATH);
	printf("windows directory = %s\n", szWindow);

	//获取system目录
	char szSystem[MAX_PATH] = { 0 };
	GetSystemDirectoryA(szSystem, MAX_PATH);
	printf("System dierctory = %s\n", szSystem);

	//获取临时文件路径
	char szTempPath[MAX_PATH] = { 0 };
	GetTempPathA(MAX_PATH, szTempPath);
	printf("TempPath = %s\n", szTempPath);


	
	char szCurrentDirectory[MAX_PATH] = { 0 };
	GetCurrentDirectoryA(MAX_PATH, szCurrentDirectory);
	printf("CurrentDirectory = %s\n", szCurrentDirectory);

	SetCurrentDirectoryA("C:\\");
	GetCurrentDirectoryA(MAX_PATH, szCurrentDirectory);
	printf("CurrentDirectory = %s\n", szCurrentDirectory);

}

int main()
{
	showDirectory();
	useDirectory();
	return 0;
}

文件

 1文件创建/打开

CreateFile

HANDLE CreateFileA(//返回文件句柄

     LPCSTR lpFileName,//文件路径和名称

     DWORD dwDesiredAccess,//访问方式

     DWORD dwShareMode,//共享模式

     LPSECURITY_ATTRIBUTES lpSecurityAttributes,//安全属性,一般置空

     DWORD dwCreationDisposition,//创建方式

     DWORD dwFlagsAndAttributes,//文件属性

     HANDLE hTemplateFile//拷贝文件句柄

    );

 

 2文件关闭

Bool CloseHandle(

  HANDLE hObject);//要关闭的文件句柄

 3文件的数据写入 

 WriteFile

  BOOL WriteFile(

HANDLE hFile,//文件句柄

LPCVOID lpBuffer,//写入数据的buff地址

DWORD nNumberOfBytesToWrite,//写入数据的buff长度

   LPDWORD lpNumberOfBytesWritten,//返回被写入数据长度

  LPOVERLAPPED lpOverLapped);//默认为空

 

 4文件的数据读取 

BOOL ReadFile(

HANDLE hFile,//文件句柄

       LPVOID lpBuffer,//读入数据buff

       DWORD nNumberOfBytesToRead,//读入数据buff长度

       LPDWORD lpNumberOfBytesRead,//返回读入数据长度

       LPOVERLAPPED lpOverlapped//         默认为空

);

 

5获取文件长度

BOOL GetFileSizeEx(

     HANDLE hFile,//文件句柄

     PLARGE_INTEGER lpFileSize//返回文件长度

    );

 

6设置文件指针

DWORD SetFilePointer(//返回已偏移量的低32位

HANDLE hFile,//文件句柄

LONG lDistanceToMove,//准备偏移量

 PLONG lpDistanceToMoveHigh,//已偏移量,高32位

 DWORD dwMoveMethod//相对位置

    );

 

7拷贝文件 

BOOL CopyFileA(

      LPCSTR lpExistingFileName,//源文件

      LPCSTR lpNewFileName,//目的文件

      BOOL bFailIfExists//是否覆盖目的的同名文件,FALSE为 覆盖

    );

8删除文件

BOOL  DeleteFileA(

 LPCSTR lpFileName//要删除的文件名

    );


 

9文件属性

9.1 GetFileAttributes - 获取文件属性

DWORD GetFileAttributesA(//返回文件的属性标识

        LPCSTR lpFileName)//文件名



9.2 GetFileAttributesEx - 获取文件属性(增强版)

BOOL

GetFileAttributesExA(

LPCSTR lpFileName,//文件名

        GET_FILEEX_INFO_LEVELS fInfoLevelId,//获取信息的级别

LPVOID lpFileInformation );//对应信息级别数据结构地址

  9.3 SetFileAttributesA

DWORD SetFileAttributesA(//返回文件的属性标识

        LPCSTR lpFileName//文件名

        DWORD lpFileInformation属性标识

    );


    示例代码:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
void Create()
{
	//创建文件
	HANDLE hFile = CreateFileA("D:\\file.txt",
		GENERIC_READ | GENERIC_WRITE,
		0,
		nullptr,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		nullptr);

	//关闭文件
	CloseHandle(hFile);
}

void Write()
{
	
	//打开文件
	HANDLE hFile = CreateFileA("D:\\file.txt", GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);

	//写入数据
	char szBuff[] = "Hello File!";
	DWORD nWritten = 0;
	WriteFile(hFile, szBuff, strlen(szBuff), &nWritten, nullptr);

	//关闭文件
	CloseHandle(hFile);
}


void Read()
{
	//打开文件
	HANDLE hFile = CreateFileA("D:\\file.txt", GENERIC_READ, 0, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	UINT64 nSize = 0;
	//获取文件长度
	//GetFileSizeEx(hFile,(PLARGE_INTEGER)&nSize);
	DWORD nHigh = 0;
	DWORD nLow = GetFileSize(hFile, &nHigh);
	nSize = MAKELONG(nLow,nHigh);



	//分配空间,

	char *pszBuf = (char*)malloc(sizeof(char)* (nLow + 1));
	memset(pszBuf, 0, nLow + 1);

	//设置当前读取位置
	SetFilePointer(hFile, 1, nullptr, FILE_BEGIN);
	//读取数据
	DWORD nRead = 0;
	ReadFile(hFile, pszBuf, nLow + 1, &nRead, nullptr);
	printf("FILE = %s\n", pszBuf);
	//关闭文件
	
	CloseHandle(hFile);
}

void Operate()
{
	//拷贝文件
	CopyFileA("d:\\file.txt", "d:\\file1.txt", FALSE);

	MoveFileA("d:\\file.txt", "d:\\file1.txt");
	//删除文件
	DeleteFileA("d:\\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 Attribute()
{
	//获取文件的属性
	DWORD nAttribute = GetFileAttributesA("D:\\file1.txt");
	printf("Attribute = %08x\n", nAttribute);


	WIN32_FILE_ATTRIBUTE_DATA data = http://www.mamicode.com/{ 0 };>

 

文件的遍历和查找

 1查找文件

FindFirstFile

HANDLE FindFirstFileA(//返回查找句柄

        LPCSTR lpFileName,//查找路径

        LPWIN32_FIND_DATAA lpFindFileData//查找的文件信息

    );

 2获取查找结果

FindNextFile

BOOL FindNextFileA(//查找成功,返回TRUE,否则返回FALSE

        HANDLE hFindFile,//查找句柄

        LPWIN32_FIND_DATAA lpFindFileData//返回查找的信息

    );

 3关闭查找

FindClose

Bool FileClose(//返回查找是否关闭成功

HANDLE hFindFile);//查找句柄

 4若要对查找结果按要求排序,需自己增加排序功能


 示例代码:

#include <Windows.h>
#include <stdio.h>
#include <tchar.h>


void Find(LPSTR path,LPSTR type)
{
	char szFind[MAX_PATH] = { 0 };
	sprintf_s(szFind, "%s%s", path, type);
	//开始查找
	WIN32_FIND_DATAA data = http://www.mamicode.com/{ 0 };>

Windows文件系统