前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理[通俗易懂]

c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理[通俗易懂]

作者头像
全栈程序员站长
发布2022-07-07 19:29:35
4720
发布2022-07-07 19:29:35
举报

大家好,又见面了,我是全栈君。

windows系统磁盘文件存储:

分区格式:NTFS / FAT32

GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 GetCurrentDirectory();//获取当前工作文件夹 SetCurrentDirectory();//改动当前工作文件夹 CreateFile/ReadFile/WriteFile/GetFileSize/SetFilePointer //返回文件大小的低32位 DWORD GetFileSize( HANDLE hFile,// handle to file LPDWORD lpFileSizeHigh //输出參数:返回文件大小的高32位 ); //创建文件并写入文本代码演示样例 HANDLE hf=CreateFile(“file.txt”,GENERIC_WRITE,FILE_SHARE_READ,NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); char txt[]=”hello file to write”; DWORD len=0;//返回实际写入的长度 WriteFile(hf,txt,strlen(txt),&len,NULL); CloseHandle(hf); //读代替码演示样例 HANDLE hf=CreateFile(“file.txt”,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); CHAR txt[1000]={0}; DWORD len=0;//实际读到的长度 ReadFile(hf,txt,sizeof(txt),&len,NULL); printf(“读取到的字符串:%s\n”,txt); CloseHandle(hf);

day75 am over! 创建文件夹:CreateDirectory 移动文件夹(不能跨分区移动)、移动文件(能够跨分区): BOOL MoveFile( LPCTSTR lpExistingFileName,// file name LPCTSTR lpNewFileName// new file name ); 删除空文件夹:RemoveDirectory 拷贝文件:CopyFile 删除文件:DeleteFile //查找文件。返回查找句柄 HANDLE FindFirstFile( LPCTSTR lpFileName, // file name LPWIN32_FIND_DATA lpFindFileData //输出參数 data buffer ); //查找下一个 BOOL FindNextFile( HANDLE hFindFile, // search handle LPWIN32_FIND_DATA lpFindFileData // data buffer ); //关闭查找句柄 BOOL FindClose( HANDLE hFindFile // file search handle ); //使用演示样例 char *path=”c:/*.*”; WIN32_FIND_DATA wfd={0}; HANDLE hf=FindFirstFile(path,&wfd); while(1) { if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) { printf(“文件夹:[%s]\n”,wfd.cFileName); } else { printf(“文件:%s\n”,wfd.cFileName); } if(FindNextFile(hf,&wfd)==0) break; }

if(hf) FindClose(hf);

演示样例代码:

代码语言:javascript
复制
// winlogic.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<STDIO.H>
#include<WINDOWS.H>
void GetLogical()
{
	UINT logic=GetLogicalDrives();
	printf("%d\n",logic);
}
void GetPath()
{
	char txt[200]={0};
	GetSystemDirectory(txt,sizeof(txt));
	printf("系统路径%s\n",txt);
	memset(txt,0,sizeof(txt));
	GetWindowsDirectory(txt,sizeof(txt));
	printf("windows路径%s\n",txt);
	memset(txt,0,sizeof(txt));
	GetCurrentDirectory(sizeof(txt),txt);
	printf("程序工作路径%s\n",txt);
	SetCurrentDirectory("c:/");
	memset(txt,0,sizeof(txt));
	GetCurrentDirectory(sizeof(txt),txt);
	printf("更改后程序工作路径%s\n",txt);

}
void CreateWrite()
{
	HANDLE hf=CreateFile("file.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,
		OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	char txt[]="hello file to write";
	DWORD len=0;//返回实际写入的长度
	WriteFile(hf,txt,strlen(txt),&len,NULL);
	CloseHandle(hf);
}
void Read()
{
	HANDLE hf=CreateFile("file.txt",GENERIC_READ,FILE_SHARE_READ,
		NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	CHAR txt[1000]={0};
	DWORD len=0;//实际读到的长度
	ReadFile(hf,txt,sizeof(txt),&len,NULL);
	printf("读取到的字符串:%s\n",txt);
	CloseHandle(hf);
}
void CreateDir()
{
	CreateDirectory("abc/",NULL);
}
void Find()
{
	char *path="c:/*.*";
	WIN32_FIND_DATA wfd={0};
	HANDLE hf=FindFirstFile(path,&wfd);
	while(1)
	{
		if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
		{
			printf("文件夹:[%s]\n",wfd.cFileName);
		}
		else
		{
			printf("文件:%s\n",wfd.cFileName);
		}
		if(FindNextFile(hf,&wfd)==0) break;
	}
	if(hf) FindClose(hf);
}
int main(int argc, char* argv[])
{
//	GetLogical();
//	GetPath();
	//CreateWrite();
	//Read();
	//CreateDir();
	Find();
	char c=0;

	printf("按随意键结束!\n");	scanf("%c",&c);	return 0;}

windows内存:

1、区域(针对内存的概念): 通常是64K的倍数。 空暇:没被使用 私有:被预定 映像:存放代码 映射:存放数据 2、物理内存 系统能够使用的实际内存,CPU能够直接訪问的内存 3、虚拟内存 将硬盘文件虚拟成内在使用(pagafile.sys),CPU假设要訪问虚拟内存数据,必须将虚拟内存数据放到物理内存。

4、内存页(针对地址的概念) 系统管理内存的最小单位。内存页大小为4K,每内存页有自己的权限。 5、页目表。

指针地址(32位): 31~22 21~12 11~0 页目(1K) 页表(1K) 页内偏移地址(4K) 6、从内存获取数据的过程 1、先在物理内存中找。 2、找不到时在虚拟内在中找。 3、假设在虚拟内存中找到,把物理内存与虚拟内存页数据交换。 4、使用物理内存数据; 5、最后可能物理内存数据与虚拟内存数据交换还原。 7、内存分配 7.1 虚拟内存分配-适合大内存分配,通常是1M之上的内存。 7.2 堆内存分配-适合小内存分配,通常是1M下面的内存。

7.3 栈内存分配-适合小内存分配,通常是1M下面的内存。 //虚拟内存分配函数,分配成功后返回地址 LPVOID VirtualAlloc( LPVOID lpAddress,//NULL或提交地址 SIZE_T dwSize, //分配大小 DWORD flAllocationType, //分配方式 DWORD flProtect//内存訪问方式 ); flAllocationType: MEM_COMMIT 分配之后返回地址和内存空间 MEM_RESERVE 保留地址。分配之后仅仅返回地址,内存空间不生成 flProtect:一般 PAGE_READWRITE

//查看内存的使用情况 VOID GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer ); typedef struct _MEMORYSTATUS { DWORD dwLength; DWORD dwMemoryLoad; DWORD dwTotalPhys;//物理内存总大小 DWORD dwAvailPhys;//物理内存可用大小 DWORD dwTotalPageFile;//虚拟内存总大小 DWORD dwAvailPageFile;//虚拟内存可用大小 DWORD dwTotalVirtual;//地址总数 DWORD dwAvailVirtual;//可用地址数 } MEMORYSTATUS, *LPMEMORYSTATUS; BOOL VirtualFree( LPVOID lpAddress,//释放地址 SIZE_T dwSize, // 释放大小 DWORD dwFreeType // 释放方式 ); dwFreeType: MEM_DECOMMIT-仅仅释放内存 MEM_RELEASE -释放内存和地址 代码演示样例: void ShowMemStatus() { MEMORYSTATUS mm; mm.dwLength=sizeof(mm); GlobalMemoryStatus(&mm); printf(“内存使用率:%d/100\n”,mm.dwMemoryLoad); printf(“TotalPhys:%u MB\n”,mm.dwTotalPhys/1024/1024); printf(“AvaliPhys:%u MB\n”,mm.dwAvailPhys/1024/1024); printf(“TotalVirtual:%u MB\n”,mm.dwTotalPageFile/1024/1024); printf(“AvaliVirtual:%u MB\n”,mm.dwAvailPageFile/1024/1024); printf(“TotalAddr:%u MB\n”,mm.dwTotalVirtual/1024/1024); printf(“AvaliAddr:%u MB\n”,mm.dwAvailVirtual/1024/1024); } void Virtual_info() { ShowMemStatus(); char* p=(char*)VirtualAlloc(NULL,1024*1024*1024,MEM_COMMIT,PAGE_READWRITE);//1G内存和地址 ShowMemStatus(); VirtualFree(p,0,MEM_RELEASE); ShowMemStatus(); } void Virtual_commit() { char* p=(char*) VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_READWRITE); strcpy(p,”HELLO MEMORY”); printf(“%s\n”,p); VirtualFree(p,0,MEM_RELEASE); } void Virtual_reserve() { //申请地址。不分配内存 char* p =(char*) VirtualAlloc(NULL,1024*1024,MEM_RESERVE,PAGE_READWRITE); char* p1=(char*)VirtualAlloc(p,4096,MEM_COMMIT,PAGE_READWRITE);//提交内存,以一个内存页4k为最小单位 strcpy(p,”HELLO MEMORY”); printf(“%s\n”,p); VirtualFree(p,0,MEM_RELEASE);

}

堆内存Heap GetProcessHeap-获取程序默认第一个堆 GetProcessHeaps-获取程序全部默认堆 演示样例: HANDLE h1=GetProcessHeap(); HANDLE hs[256]={0}; DWORD count=GetProcessHeaps(256,hs); HeapCreate -创建堆 HeapAlloc -从堆分配内存 -把内存还给堆 HeapDestroy -销毁堆 演示样例: HANDLE h= HeapCreate(HEAP_NO_SERIALIZE,1024*1024,0); char* p= (char*) HeapAlloc(h,HEAP_ZERO_MEMORY,2*1024*1024); strcpy(p,”123456″); printf(“%s\n”,p); HeapFree(h,0,p); HeapDestroy(h); 假设要使用,建议用:malloc/new 和 free/delete

内存映射文件的操作。速度快: 1、先创建一个硬盘文件 CreateFile() 2、创建内存映射文件 HANDLE CreateFileMapping( HANDLE hFile, // 硬盘文件的句柄 LPSECURITY_ATTRIBUTES lpAttributes, // 传0即可 DWORD flProtect, // protection DWORD dwMaximumSizeHigh, // 高32位大小。小于4G传0 DWORD dwMaximumSizeLow, // 低32位大小 LPCTSTR lpName // 命名,能够为NULL ); 3、获取映射文件里某部分的地址 LPVOID MapViewOfFile( HANDLE hFileMappingObject, // 映射文件句柄 DWORD dwDesiredAccess, // 訪问权限 DWORD dwFileOffsetHigh, // 高32位大小。小于4G传0 DWORD dwFileOffsetLow, // 低32位大小 SIZE_T dwNumberOfBytesToMap // 映射的字节数量 ); dwFileOffsetHigh和dwFileOffsetLow 的合成必须是64K的整数倍。 4、断开地址和映射文件某部分 BOOL UnmapViewOfFile( LPCVOID lpBaseAddress// ); 5、关闭映射文件 CloseHandle(HANDLE) 6、关闭硬盘文件 CloseHandle(HANDLE); 演示样例: HANDLE file=CreateFile(“file.txt”,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ, 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); HANDLE map=CreateFileMapping(file,0,PAGE_READWRITE,0,1024*1024,”pkm”); // char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0); strcpy(p,”adsadsad asd as d\n as d a\n s d as d a s aaaaa bbbbb ccccc\n”); printf(“%s\n”,p); UnmapViewOfFile(p); getchar(); CloseHandle(map);//关闭就没了,假设其它进程要使用,则不能关。

CloseHandle(file);//关闭了还在硬盘上

其它进程获取本进程已经创建好的映射文件,不能提前关闭映射文件 HANDLE OpenFileMapping( DWORD dwDesiredAccess, // access mode BOOL bInheritHandle, // 返回值是否能被子进程使用 LPCTSTR lpName // 映射名称 ); 演示样例: HANDLE map=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,”pkm”); char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0); printf(“%s\n”,p); UnmapViewOfFile(p);

演示样例代码:

代码语言:javascript
复制
// winVirtual.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<STDIO.H>
#include <WINDOWS.H>
void ShowMemStatus()
{
	MEMORYSTATUS mm;
	mm.dwLength=sizeof(mm);
	GlobalMemoryStatus(&mm);
	printf("内存使用率:%d/100\n",mm.dwMemoryLoad);
	printf("TotalPhys:%u MB\n",mm.dwTotalPhys/1024/1024);
	printf("AvaliPhys:%u MB\n",mm.dwAvailPhys/1024/1024);
	printf("TotalVirtual:%u MB\n",mm.dwTotalPageFile/1024/1024);
	printf("AvaliVirtual:%u MB\n",mm.dwAvailPageFile/1024/1024);
	printf("TotalAddr:%u MB\n",mm.dwTotalVirtual/1024/1024);
	printf("AvaliAddr:%u MB\n",mm.dwAvailVirtual/1024/1024);
}
void Virtual_info()
{
	ShowMemStatus();
	char* p=(char*)VirtualAlloc(NULL,1024*1024*1024,MEM_COMMIT,PAGE_READWRITE);
	ShowMemStatus();
	VirtualFree(p,0,MEM_RELEASE);
	ShowMemStatus();
}
void Virtual_commit()
{
	char* p=(char*) VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_READWRITE);
	strcpy(p,"HELLO MEMORY");
	printf("%s\n",p);
	VirtualFree(p,0,MEM_RELEASE);
}
void Virtual_reserve()
{
	//申请地址,不分配内存
	char* p =(char*) VirtualAlloc(NULL,1024*1024,MEM_RESERVE,PAGE_READWRITE);
	char* p1=(char*)VirtualAlloc(p,4096,MEM_COMMIT,PAGE_READWRITE);//提交内存,以一个内存页4k为最小单位
	strcpy(p,"HELLO MEMORY");
	printf("%s\n",p);
	VirtualFree(p,0,MEM_RELEASE);
}
void HeapInfo()
{
	HANDLE h1=GetProcessHeap();
	printf("h1-%d\n",h1);
	HANDLE hs[256]={0};
	DWORD count=GetProcessHeaps(256,hs);
	for(int i=0;i<count;i++)
	{
		printf("%d-%d\n",i,hs[i]);
	}
}
void MyHead()
{
	HANDLE h= HeapCreate(HEAP_NO_SERIALIZE,1024*1024,0);
	char* p= (char*) HeapAlloc(h,HEAP_ZERO_MEMORY,2*1024*1024);
	strcpy(p,"123456");
	printf("%s\n",p);
	HeapFree(h,0,p);
	HeapDestroy(h);
}

void FileMap()
{
	HANDLE file=CreateFile("file.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
		0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	HANDLE map=CreateFileMapping(file,0,PAGE_READWRITE,0,1024*1024,"pkm");
	//
	char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0);
	strcpy(p,"adsadsad asd as d\n as d a\n s d as d a s aaaaa bbbbb ccccc\n");
	printf("%s\n",p);
	UnmapViewOfFile(p);
	getchar();
	CloseHandle(map);//关闭就没了。假设其它进程要使用。则不能关。	CloseHandle(file);//关闭了还在硬盘上}void ReadFileMap(){HANDLE map=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,"pkm");char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0);printf("%s\n",p);UnmapViewOfFile(p);CloseHandle(map);//关闭就没了}int main(int argc, char* argv[]){	//Virtual_info();	//Virtual_commit();	//Virtual_reserve();	//HeapInfo();	//MyHead();	FileMap();        //ReadFileMap();	return 0;}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116369.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • windows系统磁盘文件存储:
  • windows内存:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档