Windows文件系统



文件系统

一 windows卷

1
卷的获取

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

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

DWORD GetLogicalDriveStrings(

DWORD nBufferLength,//buff 大小

LPTSTR  lpBuffer);//buff指针

Buff存放数据格式:

A:\ +0+ 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 = { 0 };
	//获取文件的属性和信息
	GetFileAttributesExA("D:\\file1.txt", GetFileExInfoStandard, &data);

	printf("attribute = %08x  nFileSizeHigh = %d  nFileSizeLow = %d \n ", data.dwFileAttributes, data.nFileSizeHigh, data.nFileSizeLow);
	PrintFileTime("CreateTime", &data.ftCreationTime);
	PrintFileTime("LastAccessTime", &data.ftLastAccessTime);
	PrintFileTime("LastWriteTime", &data.ftLastWriteTime);
}
int main()
{
	FindNextFileA
	Operate();
	Create();
	Write();
	Read();
	Operate();
	Attribute();
	return 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 = { 0 };
	HANDLE hFindFile = FindFirstFileA(szFind, &data);

	bool bet = true;

	//显示查找结果

	while (bet)
	{
		if (data.dwFileAttributes ==  FILE_ATTRIBUTE_DIRECTORY)
		{
			printf("[%s]\n", data.cFileName);

			if (data.cFileName[0] != '.')
			{
				//构造下级路径
				char szNextPath[MAX_PATH] = { 0 };
				sprintf_s(szNextPath, "%s%s\\", path, data.cFileName);

				//搜索下层目录
				Find(szNextPath, type);
			}
		}
		else
		{
			printf("%s\n", data.cFileName);
		}
		bet = FindNextFileA(hFindFile, &data);
	}

	//关闭查找
	FindClose(hFindFile);
}

int main()
{
	Find("D:\\masm32\\","*.*");//查找路径和文件

	return 0;
}
时间: 2024-10-23 18:04:57

Windows文件系统的相关文章

【Windows Server存储】windows文件系统

windows文件系统 弹性文件系统(ReFS) 无检查磁盘,Windows 8或Windows Server 2012以上运行. 参考资料表明,这是一个失败的文件系统,以后将不会商用. 参考资料:https://en.wikipedia.org/wiki/ReFS NTFS在目前还是主流. ReFS文件系统使用时要特别小心,尤其是在数据库中,很多底层API不兼容ReFS文件系统. 虽然细节到每一步教学非常有用,但别人都有教程了,我还再做一次作甚,肯定是用他们的,也默默的说一句感谢他们. 我详细

windows 文件系统之基础

1.文件路径的长度被限制 260 个字符,这 260 个字符包括卷标.路径.主文件名和扩展名以及分隔符.在 Windows NT 系统中,字符使用的是Unicode 宽字符.英文和中文都占用两个字节. 2.特殊字符则不能在文件名的任何位置出现. 特殊字符一共有 9 个,分别为:“/”.“∣”“\”. “*”.“?”."<".“>”.“””.“:”. 3.在 DOS 下被保留的设备名不能作为文件名或者主文件名.它们是:CON.PRN.AUX.NUL.COM1.COM2.COM

24.windows文件系统

1.windows文件 (1)创建或打开windows文件 HANDLE  CreateFile( LPCTSTR                           lpFileName,                   //文件名称 DWORD                            dwDesiredAccess,          //访问权限 DWORD                            dwShareMode,              //共享

Windows文件系统加密软件哪个好用?公司电脑文档加密应该怎么做呢?山东风奥科技

如何的市场,伴随着信息化技术的推进,企业的日常办公都有赖于对电脑的使用,电脑成为日常数据产生,以及日常数据存储的通道之一.电子化设备的使用,不仅方便了政企机关单位,同时对人们的生产生活也造成了巨大的影响,信息化一方面给企业的办公带来了便利,另一方面也使得电脑文件在生产和使用中面临着数据泄露的风险.因而,对于现阶段的企事业单位以及国内的相关机构来说,采取必要的措施来实现对自身环境下的数据文件加密,是非常有必要的. 为什么说是Windows系统加密?毕竟Windows系统底层是对外开放接口的,能够做

Linux挂载Windows文件系统

1.下载ntfs-3g进行安装 [[email protected] ~]# export PS1='[\[email protected]\h \w]\$'[[email protected] ~]#tar zxvf ntfs-3g_ntfsprogs-2014.2.15.tgz[[email protected] ~/ntfs-3g_ntfsprogs-2014.2.15]#./configure --prefix=/usr/local/ntfs-3g[[email protected] ~

文件系统

Linux 文件系统类型 磁盘文件系统. 包括硬盘. CD-ROM.DVD.USB存储器.磁盘阵列等.常见文件系统格式有:autofs.coda.Ext(Extended File sytem,扩展文件系统).Ext2.Ext3.VFAT.ISO9660(通常是CD-ROM).UFS(Unix File System,Unix文件系统).FAT(File Allocation Table,文件分配表).FAT16.FAT32.NTFS(New Technology File System)等.

第五章 文件系统

5.1 根文件系统 众所周知,在一块新的硬盘中安装系统前必须要先分区并且格式化,然后才能装系统. 对于windows来说,分区完成以后,每个分区都是一个独立的文件系统.也就意味着C盘和D盘是毫无关系的.访问时也是各自独立的. 对于linux来说,所有的文件在linux主机上,若想使其能够被访问到,站在逻辑结构视角上看,它必须从一个称为根文件系统的位置开始,但是并不是说所有文件必须从根开始就不需要分区了,并非如此.为了能够实现多个文件系统独立管理必须要进行分区.但是任何一个分区在分区完以后,不可以

Hadoop学习笔记_7_分布式文件系统HDFS --DataNode体系结构

分布式文件系统HDFS --DataNode体系结构 1.概述 DataNode作用:提供真实文件数据的存储服务. 文件块(block):最基本的存储单位[沿用的Linux操作系统地概念].对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block. 与Linux操作系统不同的是,一旦上传了一个小于Block大小的文件,则该文件会占用实际文件大小的空间. 2.进入hdfs-default.xml <prope

磁盘管理和文件系统挂载

磁盘管理和文件系统特性 一,磁盘相关 硬盘通过接口类型可以区分为: 并行:IDE,SCSI 串行:SATA,SAS,USB等 根据接口和转速(rpm)不同,硬盘读写速度不同. 在linux下硬件已设备文件存在,关联对应的设备驱动程序与对应的硬件设备通信,设备只有元数据,没有数据. vim /proc/devices 可查看字符设备号和块设备号 cat /dev/  可查看设备文件 Linux下磁盘文件命名规则 /dev/sd[a-p][1-15]:为SCSI, SATA,U盘, /dev/hd[