`
shenjichao2009
  • 浏览: 96066 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用C++对磁盘进行检测,获取磁盘相应的信息

    博客分类:
  • C++
阅读更多

extern "C" _declspec(dllexport)int getLogicDiskInfo()
{
int DType;
int si = 0;

BOOL result;
unsigned _int64 i64FreeBytesToCaller;
unsigned _int64 i64TotalBytes;
unsigned _int64 i64FreeBytes;

float totalSize;//总空间
float usableSize;//可用空间

int DSLength = GetLogicalDriveStrings(0,NULL);//通过该函数获取所有驱动器字符串信息长度
cout<<"长度为:"<<DSLength<<endl;


ofstream in;//向文件写内容
in.open("D:\\disk\\info.txt",ios::trunc);//ios::trunc表示在打开文件前将文件清空,由于是写入操作,当文件不存在则创建

char* DStr = new char[DSLength];
GetLogicalDriveStrings(DSLength,(LPTSTR)DStr);
for(int i=0;i<DSLength/4;++i)
{
char dir[3] = {DStr[si],':','\\'};
//cout<<"磁盘名称为:"<<dir[0]<<dir[1]<<dir[2]<<endl;
in<<"磁盘名称为:"<<dir[0]<<dir[1]<<dir[2]<<"\n";

char str[3] = {0,0,0};
str[0] = dir[0];
str[1] = dir[1];

string dirName = str;

DType = GetDriveType((LPTSTR)DStr+i*4);//通过该函数获取磁盘的类型
string driverType;

if(DType == DRIVE_FIXED)
{
driverType = "本地磁盘";
//cout<<driverType<<endl;
in<<"磁盘类型为:"<<driverType<<"\n";
}
else if(DType == DRIVE_CDROM)
{
driverType = "光驱";
//cout<<driverType<<endl;
in<<"磁盘类型为:"<<driverType<<"\n";
}
else if(DType == DRIVE_REMOVABLE)
{
driverType = "可移动磁盘";
//cout<<driverType<<endl;
in<<"磁盘类型为:"<<driverType<<"\n";
}
else if(DType == DRIVE_REMOTE)
{
driverType = "网络磁盘";
//cout<<driverType<<endl;
in<<"磁盘类型为:"<<driverType<<"\n";
}
else if(DType == DRIVE_RAMDISK)
{
driverType = "虚拟RAM磁盘";
//cout<<driverType<<endl;
in<<"磁盘类型为:"<<driverType<<"\n";
}
else if(DType == DRIVE_UNKNOWN)
{
driverType = "未知设备";
//cout<<driverType<<endl;
in<<"磁盘类型为:"<<driverType<<"\n";
}

if(dirName == "C:")//当磁盘为C盘时
{
result = GetDiskFreeSpaceEx(_T("C:"),(PULARGE_INTEGER)&i64FreeBytesToCaller,(PULARGE_INTEGER)&i64TotalBytes,(PULARGE_INTEGER)&i64FreeBytes);//获取磁盘的空间状态
if(result)
{
totalSize = (float)i64TotalBytes/1024/1024/1024;
usableSize = (float)i64FreeBytesToCaller/1024/1024/1024;
//cout<<"总空间为:"<<totalSize<<"GB"<<endl;
//cout<<"可用空间为:"<<usableSize<<"GB"<<endl;
//cout<<"=============================================================="<<endl;

in<<"总空间为:"<<totalSize<<"GB"<<"\n";
in<<"可用空间为:"<<usableSize<<"GB"<<"\n";
in<<"=============================================================="<<"\n";
}
else
{
//cout<<"未检测到磁盘设备"<<endl;
in<<"未检测到磁盘设备"<<"\n";
}
}
else if(dirName == "D:")//当磁盘为D盘时
{
result = GetDiskFreeSpaceEx(_T("D:"),(PULARGE_INTEGER)&i64FreeBytesToCaller,(PULARGE_INTEGER)&i64TotalBytes,(PULARGE_INTEGER)&i64FreeBytes);//获取磁盘的空间状态
if(result)
{
totalSize = (float)i64TotalBytes/1024/1024/1024;
usableSize = (float)i64FreeBytesToCaller/1024/1024/1024;
//cout<<"总空间为:"<<totalSize<<"GB"<<endl;
//cout<<"可用空间为:"<<usableSize<<"GB"<<endl;
//cout<<"=============================================================="<<endl;

in<<"总空间为:"<<totalSize<<"GB"<<"\n";
in<<"可用空间为:"<<usableSize<<"GB"<<"\n";
in<<"=============================================================="<<"\n";
}
else
{
//cout<<"未检测到磁盘设备"<<endl;
in<<"未检测到磁盘设备"<<"\n";
}
}
else if(dirName == "E:")//当磁盘为E盘时
{
result = GetDiskFreeSpaceEx(_T("E:"),(PULARGE_INTEGER)&i64FreeBytesToCaller,(PULARGE_INTEGER)&i64TotalBytes,(PULARGE_INTEGER)&i64FreeBytes);//获取磁盘的空间状态
if(result)
{
totalSize = (float)i64TotalBytes/1024/1024/1024;
usableSize = (float)i64FreeBytesToCaller/1024/1024/1024;
//cout<<"总空间为:"<<totalSize<<"GB"<<endl;
//cout<<"可用空间为:"<<usableSize<<"GB"<<endl;
//cout<<"=============================================================="<<endl;

in<<"总空间为:"<<totalSize<<"GB"<<"\n";
in<<"可用空间为:"<<usableSize<<"GB"<<"\n";
in<<"=============================================================="<<"\n";
}
else
{
//cout<<"未检测到磁盘设备"<<endl;
in<<"未检测到磁盘设备"<<"\n";
}
}
else if(dirName == "F:")//当磁盘为F盘时
{
result = GetDiskFreeSpaceEx(_T("F:"),(PULARGE_INTEGER)&i64FreeBytesToCaller,(PULARGE_INTEGER)&i64TotalBytes,(PULARGE_INTEGER)&i64FreeBytes);//获取磁盘的空间状态
if(result)
{
totalSize = (float)i64TotalBytes/1024/1024/1024;
usableSize = (float)i64FreeBytesToCaller/1024/1024/1024;
//cout<<"总空间为:"<<totalSize<<"GB"<<endl;
//cout<<"可用空间为:"<<usableSize<<"GB"<<endl;
//cout<<"=============================================================="<<endl;

in<<"总空间为:"<<totalSize<<"GB"<<"\n";
in<<"可用空间为:"<<usableSize<<"GB"<<"\n";
in<<"=============================================================="<<"\n";
}
else
{
//cout<<"未检测到磁盘设备"<<endl;
in<<"未检测到磁盘设备"<<"\n";
}
}
else if(dirName == "G:")//当磁盘为E盘时
{
result = GetDiskFreeSpaceEx(_T("G:"),(PULARGE_INTEGER)&i64FreeBytesToCaller,(PULARGE_INTEGER)&i64TotalBytes,(PULARGE_INTEGER)&i64FreeBytes);//获取磁盘的空间状态
if(result)
{
totalSize = (float)i64TotalBytes/1024/1024/1024;
usableSize = (float)i64FreeBytesToCaller/1024/1024/1024;
//cout<<"总空间为:"<<totalSize<<"GB"<<endl;
//cout<<"可用空间为:"<<usableSize<<"GB"<<endl;
//cout<<"=============================================================="<<endl;

in<<"总空间为:"<<totalSize<<"GB"<<"\n";
in<<"可用空间为:"<<usableSize<<"GB"<<"\n";
in<<"=============================================================="<<"\n";
}
else
{
//cout<<"未检测到磁盘设备"<<endl;
in<<"未检测到磁盘设备"<<"\n";
}
}

si+=8;
}

in.close();//关闭文件

if(NULL != DType)
{
return DType;
}
else
{
return -1;
}
}

 

该代码主要用来获取磁盘的盘符、磁盘的类型、磁盘的总空间大小以及磁盘的可用空间大小。

 

public static Map<String, ReturnPo> getDiscInfo() {

String dirName = "D:\\disk\\";
String fileName = "info.txt";

String diskNameStr = "磁盘名称";
String diskTypeStr = "磁盘类型";
String totalSizeStr = "总空间";
String usableSizeStr = "可用空间";

String diskName = null;
String diskType = null;

float totalSize = 0;
float usableSize = 0;

Map<String, ReturnPo> map = new HashMap<String, ReturnPo>();
ReturnPo returnPo = new ReturnPo();
List<UsbPo> list = new ArrayList<UsbPo>();
UsbPo usbPo = null;

JNative jNative = null;

try {

jNative = new JNative("PCsuite", "getLogicDiskInfo");// 加载PCsuite.dll文件

jNative.setRetVal(Type.INT);
// jNative.invoke();

File file = new File(dirName + fileName);// 实例化文件对象,读取一个放置于本地磁盘中存放磁盘信息的文件
if (file.exists()) {

BufferedReader br = new BufferedReader(new FileReader(file));

String line = null;
int count = 0;
int number = 0;

for (int i = 0; i <= count; i++) {

while ((line = br.readLine()) != null) {

if (number % 5 == 0) {
usbPo = new UsbPo();// 实例化磁盘对象,用来存放磁盘信息
}

if (!"=============================================================="
.equals(line)) {

if (line.contains(diskNameStr)) {

diskName = line
.substring(line.indexOf(":") + 1);// 获取盘符名称
usbPo.setName(diskName);// 设置盘符名称
number++;

} else if (line.contains(diskTypeStr)) {

diskType = line
.substring(line.indexOf(":") + 1);// 获取磁盘类型
if (diskType.equals(localDiscName))// 当磁盘类型为本地磁盘时
{

usbPo.setFlag(0);// 当磁盘类型为本地磁盘时,设置为0
number++;

} else if (diskType.equals(moveDiscName))// 当磁盘类型为可移动磁盘时
{

usbPo.setFlag(1);// 当磁盘类型为可移动磁盘时,设置为1
number++;

}

} else if (line.contains(totalSizeStr)) {

totalSize = Float.parseFloat(line.substring(
line.indexOf(":") + 1, line
.indexOf("GB")));// 获取磁盘的总空间
usbPo.setTotalSize(totalSize);// 设置磁盘的总空间
number++;

} else if (line.contains(usableSizeStr)) {

usableSize = Float.parseFloat(line.substring(
line.indexOf(":") + 1, line
.indexOf("GB")));// 获取磁盘的可用空间
usbPo.setUsableSize(usableSize);// 设置磁盘的可用空间
number++;

}

if (null != usbPo && null != usbPo.getName()
&& !"".equals(usbPo.getName())
&& usbPo.getTotalSize() > 0
&& usbPo.getUsableSize() > 0) {

list.add(usbPo);// 将磁盘信息添加一个列表中

}

} else {

count++;
number++;
System.out.println("count is:" + count);

}

}

}

returnPo.setExcept(null);
returnPo.setResultFlag(true);
returnPo.setResultInfo(list);
returnPo.setMethodId(InvokeMethod.methodId1);

map.put(SocketServer.resultInfo, returnPo);

} else {

logger.error("not finding this file……");

}

} catch (NativeException e) {

e.printStackTrace();
returnPo.setExcept(e);
returnPo.setResultFlag(false);
returnPo.setResultInfo(e.getMessage());
logger.error(e);

map.put(SocketServer.resultInfo, returnPo);
return map;

} catch (IllegalAccessException e) {

e.printStackTrace();
returnPo.setExcept(e);
returnPo.setResultFlag(false);
returnPo.setResultInfo(e.getMessage());
logger.error(e);

map.put(SocketServer.resultInfo, returnPo);
return map;

} catch (FileNotFoundException e) {

e.printStackTrace();
returnPo.setExcept(e);
returnPo.setResultFlag(false);
returnPo.setResultInfo(e.getMessage());
logger.error(e);

map.put(SocketServer.resultInfo, returnPo);
return map;

} catch (IOException e) {

e.printStackTrace();
returnPo.setExcept(e);
returnPo.setResultFlag(false);
returnPo.setResultInfo(e.getMessage());
logger.error(e);

map.put(SocketServer.resultInfo, returnPo);
return map;

}

return map;

}

 

做法概要:通过使用C++代码,编译生成相应的dll文件,然后通过JNative去调用生成的dll文件,并调取相应的方法进行检测。
分享到:
评论

相关推荐

    C++ 读取硬盘序列号、驱动类型、卷标等

    本主题涉及的是如何使用C++来获取硬盘的相关信息,包括硬盘序列号、驱动类型以及卷标。这些信息在系统管理和软件开发中非常有用,例如在数据恢复、系统监控或硬件认证场景下。 首先,我们需要理解硬盘的基本概念。...

    获取系统信息(CPU、内存大小、操作系统版本及其他)

    本篇文章将详细讲解如何利用C++编程语言在Windows XP操作系统上获取CPU、内存大小、硬盘空间、操作系统版本、打印机名称以及显卡名称等关键系统信息。 首先,获取CPU信息通常涉及读取性能计数器(Performance ...

    vs2010 c++ 文件夹文件监控系统软件

    3. 处理变更:当收到变更通知时,根据不同的事件类型(如CREATE、DELETE、MODIFY等),进行相应的处理,如记录日志、更新UI等。 4. 关闭监控:当不再需要监控时,调用FindCloseChangeNotification关闭监控。 5. ...

    c++编写的文件目录监视程序

    本项目是基于C++实现的文件目录监视程序,其核心功能在于实时检测并响应指定目录下的文件或子目录的变更情况。这在很多应用场景中都是至关重要的,例如日志跟踪、文件同步、版本控制系统等。 首先,我们需要理解C++...

    VC 检测电脑的插入的移动磁(优)盘源码.rar

    2. **枚举设备接口**:对每个设备,使用`SetupDiEnumDeviceInterfaces`函数获取设备接口的详细信息。 3. **分配并填充SP_DEVICE_INTERFACE_DATA结构**:为每个找到的设备接口分配内存,并设置相应的结构体。 4. **...

    C/C++实现FAT文件系统的读写

    1. **磁盘I/O**:使用标准输入/输出库或第三方库如libdisk来访问磁盘扇区,进行读写操作。 2. **解析MBR**:读取MBR以获取分区信息,包括FAT类型(FAT12、FAT16或FAT32)和FAT表的位置。 3. **理解FAT表**:根据...

    获取U盘ID源码,如果未插U盘直接读取磁盘序列号

    - 例如在C#中,可以使用`ManagementObjectSearcher`类查询WMI(Windows Management Instrumentation)来获取磁盘信息。而在C++中,会直接使用Windows API函数进行设备访问。 7. **安全性与权限**: - 读取设备ID...

    职工工资管理系统(C++控制台程序 实现)

    开发者可能使用了C++的`std::cin`和`std::cout`来获取用户输入并显示输出。例如,程序可能会提示用户输入员工ID,然后调用相应的函数处理工资数据。此外,还可能使用了`switch`语句或函数指针来实现多选择菜单,让...

    C++和opencv100图像处理的API接口可以直接调用

    首先,要开始使用OpenCV,你需要在你的C++项目中包含相应的头文件,如`#include &lt;opencv2/opencv.hpp&gt;`。这个头文件会引入OpenCV库中的大部分核心功能。接下来,确保正确链接了OpenCV库,这通常在项目的构建设置中...

    C++网络爬虫项目

    从架构层面,搜索引擎需要能够对以百亿计的海量网页进行获取、 存 储、 处理的能力,同时要保证搜索结果的质量。 如何获取、 存储并计算如此海WEBCRAWLER 网络爬虫实训项目 3 量的数据?如何快速响应用户的查询?...

    易语言源码易语言取物理磁盘源码.rar

    在易语言中,实现“取物理磁盘”功能可能需要调用系统API函数,如Windows API中的`GetLogicalDrives`来获取可用磁盘列表,或者使用`DeviceIoControl`来获取更详细的信息。源码可能会涉及错误处理、权限验证等环节。...

    C++图像处理几何校正可运行工程

    为了获取正确的控制点,可能需要先进行特征检测和匹配,如SIFT(尺度不变特征变换)或SURF(加速稳健特征)。OpenCV库也提供了相应的函数,如`cv::goodFeaturesToTrack`用于检测角点,`cv:: DescriptorMatcher`类...

    MFC 识别可移动磁盘,显示盘符

    在标题和描述中提到的“MFC 识别可移动磁盘,显示盘符”是一个功能,它允许开发者编写程序来检测插入的可移动存储设备(如USB驱动器),并获取其盘符,以便进行文件操作。下面我们将详细讲解这个过程。 首先,要...

    检测USB接口的硬件设备

    使用DeviceIoControl()函数,可以获取设备的物理和逻辑磁盘信息。 对于Windows Mobile和Android手机,虽然它们也是通过USB接口连接,但识别和管理方式有所不同。Windows Mobile设备通常表现为大容量存储设备,类似...

    实时记录进程资源占用情况

    例如,为了获取进程资源信息,你需要打开一个系统快照,遍历进程列表,对每个进程进行查询,获取其资源使用数据,最后将这些数据存储到合适的数据结构中,如数组或数据库,以便后续分析。 在实际应用中,为了实现...

    MFC重复行删除工具(C/C++)

    在C++中,我们通常会通过读取文件内容到内存,然后对每一行进行处理来实现这个功能。MFC提供了丰富的文件操作类,如CFile和CStdioFile,可以帮助我们读取和写入文件。 1. **文件读取**:首先,我们需要创建一个...

    获取盘符资料获取盘符资料获取盘符资料获取盘符资料获取盘符资料

    根据提供的标题、描述、标签及部分内容,本文将详细介绍与“获取盘符资料”相关的知识点,包括如何使用不同的API函数来获取计算机上的驱动器信息,并解释其中涉及到的关键代码片段。 ### 获取盘符资料 #### 一、...

    File watcher in c++.zip

    当检测到变化时,根据返回的错误代码判断具体变更类型,并采取相应行动。 2. **Unix/Linux系统上的inotify**:Linux内核自2.6.13版本起提供了inotify接口,它允许应用程序订阅文件系统事件。通过open、read、close...

    在NetBeans中C-C++ 项目快速入门教程 (2).docx

    对于Solaris和Linux平台,你可以使用GNU C和C++编译器,以及相应的make和gdb。 3. **示例项目** - IDE内包含一些示例项目,可帮助你快速熟悉环境。 **创建C/C++项目** 创建项目的基本流程如下: 1. 选择“文件”&gt;...

Global site tag (gtag.js) - Google Analytics