监控磁盘大小c语言

作者&投稿:佘黄 (若有异议请与网页底部的电邮联系)
~ 这篇文章主要介绍了C/C++ 监控磁盘与目录操作的示例,帮助大家更好的理解和学习C/C++编程,感兴趣的朋友可以了解下
遍历磁盘容量:
#include <stdio.h>
#include <Windows.h>

void GetDrivesType(const char* lpRootPathName)
{
UINT uDriverType = GetDriveType(lpRootPathName);
switch (uDriverType)
{
case DRIVE_UNKNOWN:puts("未知磁盘"); break;
case DRIVE_NO_ROOT_DIR: puts("路径无效"); break;
case DRIVE_REMOVABLE: puts("可移动磁盘"); break;
case DRIVE_FIXED: puts("固定磁盘"); break;
case DRIVE_REMOTE: puts("网络磁盘"); break;
case DRIVE_CDROM: puts("光驱"); break;
case DRIVE_RAMDISK: puts("内存映射盘"); break;
default: break;
}
}

void GetDrivesFreeSpace(const char* lpRootPathName)
{
unsigned long long available, total, free;
if (GetDiskFreeSpaceEx(lpRootPathName, (ULARGE_INTEGER*)&available,
(ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free))
{
printf("磁盘: %s | 总计: %lld MB 已用: %lld MB 剩余: %lld MB \n",
lpRootPathName, total >> 20, available >> 20, free >> 20);
}
}

int main(int argc,char *argv[])
{
DWORD dwSize = MAX_PATH;
char szLogicalDrives[MAX_PATH] = {0};

// 获取逻辑驱动器号字符串
DWORD dwResult = GetLogicalDriveStringsA(dwSize, szLogicalDrives);

if (dwResult > 0 && dwResult <= MAX_PATH) {
char* szSingleDrive = szLogicalDrives; // 从缓冲区起始地址开始
while (*szSingleDrive) {
//printf("Drive: %s\n", szSingleDrive); // 输出单个驱动器的驱动器号
// GetDrivesType(szSingleDrive);
GetDrivesFreeSpace(szSingleDrive);
szSingleDrive += strlen(szSingleDrive) + 1; // 获取下一个驱动器地址
}
}

system("pause");
return 0;
}
遍历文件特定路径:
循环遍历文件路径,并将文件后缀为.exe的路径筛选出来.
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

void SearchFile(char *pszDirectory)
{
// 搜索指定类型文件
char *pszFileName = NULL;
char *pTempSrc = NULL;
WIN32_FIND_DATA FileData = { 0 };

// 申请动态内存
pszFileName = new char[2048];
pTempSrc = new char[2048];

// 构造搜索文件类型字符串 *.* 表示搜索所有文件类型
wsprintf(pszFileName, "%s\\*.*", pszDirectory);

HANDLE hFile = ::FindFirstFile(pszFileName, &FileData);
if (INVALID_HANDLE_VALUE != hFile)
{
do
{
// 过滤掉当前目录"." 和上一层目录".."
if ('.' == FileData.cFileName[0])
continue;

// 拼接文件路径
wsprintf(pTempSrc, "%s\\%s", pszDirectory, FileData.cFileName);
// 判断是否是目录还是文件
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
SearchFile(pTempSrc); // 如果是目录则继续递归
else
{
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
_splitpath(pTempSrc, drive, dir, fname, ext);
// 如果是文件并且后缀为.exe则输出具体路径
if (strcmp(ext, ".exe") == 0)
printf("%s \n", pTempSrc);
}
} while (::FindNextFile(hFile, &FileData));
}
FindClose(hFile);
delete[]pTempSrc;
delete[]pszFileName;
}

int main(int argc, char * argv[])
{
SearchFile("c:\\MinGW7");
system("pause");
return 0;
}
监控文件目录变化:
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

UINT MonitorFileThreadProc(LPVOID lpVoid)
{
char *pszDirectory = (char *)lpVoid;

// 打开目录, 获取文件句柄
HANDLE hDirectory = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == hDirectory)
return 1;

char szFileName[MAX_PATH] = { 0 };
BOOL bRet = FALSE;
DWORD dwRet = 0;
DWORD dwBufferSize = 2048;

// 申请一个足够大的缓冲区
BYTE *pBuf = new BYTE[dwBufferSize];
if (NULL == pBuf)
return 2;

FILE_NOTIFY_INFORMATION *pFileNotifyInfo = (FILE_NOTIFY_INFORMATION *)pBuf;

// 开始循环设置监控
do
{
RtlZeroMemory(pFileNotifyInfo, dwBufferSize);
// 设置监控目录
bRet = ReadDirectoryChangesW(hDirectory, pFileNotifyInfo, dwBufferSize, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名
FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件属性
FILE_NOTIFY_CHANGE_LAST_WRITE, // 最后一次写入
&dwRet, NULL, NULL);
if (FALSE == bRet)
break;

// 将宽字符转换成窄字符,宽字节字符串转多字节字符串
WideCharToMultiByte(CP_ACP, 0, (wchar_t *)(&pFileNotifyInfo->FileName),
(pFileNotifyInfo->FileNameLength / 2),szFileName,MAX_PATH,NULL,NULL);

// 将路径与文件连接成完整文件路径
char FullFilePath[1024] = { 0 };
strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));
strcat(FullFilePath, szFileName);

// 判断操作类型并显示
switch (pFileNotifyInfo->Action)
{
case FILE_ACTION_ADDED:
printf("文件被 [创建]: %s \n", FullFilePath); break;
case FILE_ACTION_REMOVED:
printf("文件被 [删除]: %s \n", FullFilePath); break;
case FILE_ACTION_MODIFIED:
printf("文件被 [修改]: %s \n", FullFilePath); break;
case FILE_ACTION_RENAMED_OLD_NAME:
printf("文件被 [重命名]: %s \n", FullFilePath); break;
}
} while (bRet);

CloseHandle(hDirectory);
delete[] pBuf;
pBuf = NULL;
return 0;
}

int main(int argc, char * argv[])
{
char *pszDirectory = "C:\\";
// 创建线程开始监控
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MonitorFileThreadProc, pszDirectory, 0, NULL);
while (1)
{
Sleep(10000);
}
system("pause");
return 0;
}
监控目录文件变化:
可以将其改为一个简单的文件防篡改程序,也可以用来监控病毒的行为.
#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h>

DWORD WINAPI MonitorFileThreadProc(LPVOID lParam)
{
char *pszDirectory = (char *)lParam;
BOOL bRet = FALSE;
BYTE Buffer[1024] = { 0 };

FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;
DWORD dwByteReturn = 0;
HANDLE hFile = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == hFile)
return 1;

while (TRUE)
{
ZeroMemory(Buffer, sizeof(Buffer));
// 设置监控目录回调函数
bRet = ReadDirectoryChangesW(hFile,&Buffer,sizeof(Buffer),TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名
FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件属性
FILE_NOTIFY_CHANGE_LAST_WRITE, // 最后一次写入
&dwByteReturn, NULL, NULL);
if (TRUE == bRet)
{
char szFileName[MAX_PATH] = { 0 };

// 将宽字符转换成窄字符,宽字节字符串转多字节字符串
WideCharToMultiByte(CP_ACP,0,pBuffer->FileName,(pBuffer->FileNameLength / 2),
szFileName,MAX_PATH,NULL,NULL);

// 将路径与文件连接成完整文件路径
char FullFilePath[1024] = { 0 };
strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));
strcat(FullFilePath, szFileName);

switch (pBuffer->Action)
{
case FILE_ACTION_ADDED:
{
printf("添加: %s \n", FullFilePath); break;
}
case FILE_ACTION_REMOVED:
{
printf("删除: %s \n", FullFilePath); break;
}
case FILE_ACTION_MODIFIED:
{
printf("修改: %s \n", FullFilePath); break;
}
case FILE_ACTION_RENAMED_OLD_NAME:
{
printf("重命名: %s", szFileName);
if (0 != pBuffer->NextEntryOffset)
{
FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)
((DWORD)pBuffer + pBuffer->NextEntryOffset);
switch (tmpBuffer->Action)
{
case FILE_ACTION_RENAMED_NEW_NAME:
{
ZeroMemory(szFileName, MAX_PATH);
WideCharToMultiByte(CP_ACP,0,tmpBuffer->FileName,
(tmpBuffer->FileNameLength / 2),
szFileName,MAX_PATH,NULL,NULL);
printf(" -> %s \n", szFileName);
break;
}
}
}
break;
}
case FILE_ACTION_RENAMED_NEW_NAME:
{
printf("重命名(new): %s \n", FullFilePath); break;
}
}
}
}
CloseHandle(hFile);
return 0;
}

int main(int argc, char * argv[])
{
char *pszDirectory = "C:\\";

HANDLE hThread = CreateThread(NULL, 0, MonitorFileThreadProc, pszDirectory, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0;
}
以上就是C/C++ 监控磁盘与目录操作的示例的详细内容

要解决这个问题,根据我们已经学过的知识,其实有这样一个简单的思路:这是一个监控程序,需要不断地检查磁盘剩余容量,所以主体上这是一个while(true)的无限循环:因为需要检查磁盘剩余容量,所以我们需要调用系统API得到系统的磁盘剩余容量,稍微google,就可以得到GetDiskFreeSpace()函数就是来做这件事的。最后,既然是检测,那就是当得到的剩余容量小于某个阀值时,提出警告,于是,这里需要用到条件语句对剩余容量进行判断,并采取不同的措施,如果满足剩余容量,这Sleep()一定时间后继续检查,如果不满足,则提出警告并结束整个循环。

按照上面的思路,我们可以将整个监控程序实现如下:

/*
============================================================================
diskCapacity1.c
Created on : 2013年10月31日16:28:13
Author : Bruce
Version : v1.0
Copyright : Your copyright notice
Description : disk capacity in C, Ansi-style
============================================================================
*/
#include <windows.h>
#include <stdio.h>
#include <stdbool.h>
int main()
{
//开始无限循环,不断见识磁盘容量
while(true)
{
ULARGE_INTEGER space;

//调用Windows API获得C盘的剩余容量
if(GetDiskFreeSpaceEx("C:",0,0,&space))
{
//将剩余字节数转换为G(千兆字节)为单位
int free = space.QuadPart/(1024*1024*1024);
//如果剩余字节数小于10千兆字节,则向用户报警,并用break关键字结束循环
if(free <10)
{
puts("WARNNING! The free space is less than 10G.");
break;
}
//休眠10分钟(60*1000),开始下一次循环
Sleep(10*60*1000);
}
}
return 0;
}

在工作过程中,很多spark在saveAsTextFile的过程中都会repartition,用于减少磁盘文件,节约内存空间;但是repartition的分区数,只能根据实际结果测试后重新进行调整或者根据自己的经验进行预估。但是当数据骤增或骤减的时候之前的经验值就不是那么可靠,而且当数据骤增时采用snapyy、gz等让当个文件过大导致task oom。

但是在实际测试、API说明中发现,SizeEstimator 只是计算了Java Heap中大小而不是磁盘落地大小。

于是使用:RDD总数/takeSample取样数*takeSample取样大小=RDD总大小;(sample 返回的数据占比不一定与参数相同)

这样有两个缺点:

有两个shuffle

结果浮动较大

所以,我们使用了累加器Accumulator,使用map获取每行的大小并进行累加,代码如下:

import org.apache.spark.SparkContext

import org.apache.spark.rdd.RDD

/**

* 通过累积器计算分区数量

*/

监控磁盘大小
   ///   
        /// 获取指定驱动器的空间总大小(单位为B) 
        ///   
        ///  只需输入代表驱动器的字母即可 (大写) 
        ///    
        public static long GetHardDiskSpace(string str_HardDiskName)
        {
            long totalSize = new long();
            str_HardDiskName = str_HardDiskName + ":\\";
            System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
            foreach (System.IO.DriveInfo drive in drives)
            {
                if (drive.Name == str_HardDiskName)
                {
                    totalSize = drive.TotalSize / (1024 * 1024 * 1024);
                }
            }
            return totalSize;
        }

        ///   
        /// 获取指定驱动器的剩余空间占比(单位为B) 
        ///   
        ///  只需输入代表驱动器的字母即可  
        ///    
        public static float GetHardDiskFreeSpaceRate(string str_HardDiskName)
        {
            long freeSpace = new long();
            float rate = 0;
            str_HardDiskName = str_HardDiskName + ":\\";
            System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
            foreach (System.IO.DriveInfo drive in drives)
            {
                if (drive.Name == str_HardDiskName)
                {
                    freeSpace = drive.TotalFreeSpace ;
                    rate = (float)freeSpace / drive.TotalSize;

                }
            }
            return rate;
        }


初始化的作用是什么
初始化就是把变量赋为默认值,把控件设为默认状态,把没准备的准备好。 但是如果是整个系统初始化那就不一样了。在汇编语言中,为变量分配空间时,初始化过的变量的初值位于可执行文件代码段数据后,会占用一定空间,不必要的初始化会造成磁盘空间的浪费。在C语言等高级语言中,为每一个变量赋初值被视...

C语言如何使用WindowsAPI获取磁盘剩余空间大小
ULARGE_INTEGER FreeBytesAvailable,TotalNumberOfBytes,TotalNumberOfFreeBytes;GetDiskFreeSpaceEx(_T("E:"),&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNumberOfFreeBytes);

C语言,有两个磁盘文件A,B,各存放一行字母,要求把两个文件信息合并并按字...
while(fgetc(fp)!=EOF) \/\/两个地方都在读,而赋值只有一个,造成你的错误现象 { a[i]=fgetc(fp);\/\/这里也在读,只赋值一次,出错了,putchar(a[i]);i++;} 把读文件操作改一下,两个地方都要改:char ch=0;while( (ch=fgetc(fp))!= EOF ){ a[i]=ch ;putchar(a[i]);i...

c语言 save函数
文本文件:: 数据以其数字字符的ASCII码形式、一个字节一个字节地存储在磁盘上。二进制文件:数据以二进制形式在存储在磁盘上。设备文件:输入\/输出设备 标准输入文件:键盘 标准输出文件\/标准错误输出文件:显示器 文件型指针:C语言是通过名为FILE的结构型指针来管理文件读写的。FILE *<变量名> 文件...

请问如何用c语言实现遍历查找磁盘下的exe文件? 我是在VC6.0平台下_百 ...
例如 DIR C:\\*.exe \/B \/S 如果要把显示 转向到文件 DIR C:\\*.exe \/B \/S >> abc.lis DOS 命令 可以用 sprintf 做成,用 system() 让它执行。程序如下:include <stdio.h> include <stdlib.h> main(){ char cmd[80];char d;for (d='C';d<='Z';d++) \/\/ 对 磁盘号 C...

C语言怎样实现信息用磁盘文件保存,求代码!!
FILE *fp; if( (fp=fopen("OUT.dat","wb"))==NULL ) { printf("Open OUT.dat Error!\\n"); exit(0); } \/\/...你的主体 \/\/ fwrite( , , , ); \/\/ fprintf("", ); fclose(fp);

C语言中fscanf函数从磁盘读取字符串是不是每次只能读取一行?
遇到空格和换行时结束 函数名: fscanf 功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。

“C语言数据文件存放到磁盘”中的磁盘指的是什么?
磁盘就是你的硬盘或者移动硬盘,也就是你电脑里的,C盘,D盘,E盘,F盘,你牛点的话 可以N个盘~~~ 你的文件什么的都是存放在你的硬盘里的,不可能说是存放在你的电脑系统里的吧?

c语言:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息...
int main(){ FILE *fp1 = NULL;FILE *fp2 = NULL;FILE *fp3 = NULL;char buf1[100] = {0};char buf2[100] = {0};char buf3[200] = {0};int i;int j;int length;char temp;fp1 = fopen("A.txt", "r");fp2 = fopen("B.txt", "r");fp3 = fopen("C.txt", "w"...

c语言 标准输入流
在C语言中流就是一种文件形式,它实际上就表示一个文件或设备(从广义上讲,设备也是一种文件)。把流当作文件总觉得不习惯,因而有人称这种和流等同的文件为流式文件,流的输入输出也称为文件的输入输出操作。当流到磁盘而成为文件时,意味着要启动磁盘写入操作,这样流入一个字符(文本流)或流入一个...

黔东南苗族侗族自治州15751014755: 如何C语言编程查看硬盘多少剩余空间?
况馥引阳: /* 在TC和BC下 */ #include &lt;stdio.h&gt; #include &lt;dos.h&gt; void main() { struct dfree dfree; long dfb; getdfree(3,&amp;dfree); /* 3:C盘,4:D盘,... */ dfb = (long)dfree.df_avail*(long)dfree.df_bsec*(long)dfree.df_sclus; printf("剩余空间:%ld 字节",dfb); }

黔东南苗族侗族自治州15751014755: 如何C语言编程查看硬盘多少剩余空间? -
况馥引阳: /* 在TC和BC下 */ #include #include void main() { struct dfree dfree; long dfb; getdfree(3,&dfree); /* 3:C盘,4:D盘,... */ dfb = (long)dfree.df_avail*(long)dfree.df_bsec*(long)dfree.df_sclus; printf("剩余空间:%ld 字节",dfb); }

黔东南苗族侗族自治州15751014755: C语言如何使用WindowsAPI获取磁盘剩余空间大小 -
况馥引阳: ULARGE_INTEGER FreeBytesAvailable,TotalNumberOfBytes,TotalNumberOfFreeBytes;GetDiskFreeSpaceEx(_T("E:"),&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNumberOfFreeBytes);

黔东南苗族侗族自治州15751014755: C语言,获取硬盘剩余空间函数的使用方法.GetDiskFreeSpaceEx函数使用方法 -
况馥引阳: GetDiskFreeSpaceEx是windows的API啊,调用之后就会获得信息.说明 获取与一个磁盘的组织以及剩余空间容量有关的信息 返回值 Long,非零表示成功,零表示失败.会设置GetLastError 参数表 参数 类型及说明 lpRootPathName String,不...

黔东南苗族侗族自治州15751014755: 怎么用C语言编程获取Linux硬盘容量大小 -
况馥引阳: system(执行shell命令)相关函数fork,execve,waitpid,popen表头文件#include定义函数intsystem(constchar*string);函数说明system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令...

黔东南苗族侗族自治州15751014755: 如何用C语言读取U盘容量 -
况馥引阳: 1. 使用GetLogicalDrives API获取计算机中存在哪些逻辑驱动器2. 对每一个逻辑驱动器,使用GetDriveType API获取类型信息,判断是否为可移动磁盘(DRIVE_REMOVABLE )3. 对其中的所有可移动磁盘,使用GetDiskFreeSpace API获取驱动器详细信息,包括总容量和剩余容量.这三个API MSDN上都有文档,很简单自己看看就好.

黔东南苗族侗族自治州15751014755: 用c#怎样读取当前盘符的大小 -
况馥引阳: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;namespace ConsoleApplication1 { class Program { static void GetDriver(string drive) { DriveInfo d = new DriveInfo(drive); Console.WriteLine...

黔东南苗族侗族自治州15751014755: C++ 怎么实现获取当前PC 硬盘 内存的大小以及已使用大小,加上CPU使用率 -
况馥引阳: 可以通过编程实现,源代码如下:// Sample output:// There is 51 percent of memory in use.// There are 2029968 total KB of physical memory.// There are 987388 free KB of physical memory.// There are 3884620 total KB of paging file.// There are ...

黔东南苗族侗族自治州15751014755: c语言 获取文件信息(文件大小,磁盘位置等~) -
况馥引阳: 《windows 程序设计》中的“文件”一章;看看MFC/VCL都行,实在不行,就用bcb的vcl很方便.恩.

黔东南苗族侗族自治州15751014755: 编写C语言程序,实现对磁盘文件的操作 -
况馥引阳: #include "stdio.h" #include "string.h" main() { FILE *fp; fp=fopen("data.txt","w"); char a[100]="hello world!"; fwrite(a,strlen(a)+1 ,sizeof(char),fp ); fclose(fp); fp=fopen("data.txt","r"); char b[100]; fread(b,strlen(a)+1 ,sizeof(char),fp ); fclose(fp); printf("%s\n",b); }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网