Здравствуйте! Нужно получить список разделов определенного жесткого диска и записать его в фаил txt, т.е. получить список разделов примерно вот в таком виде:
1 - D
2 - C
3 - E
Во общем чтобы знать как присвоены буквы разделов по порядковому номеру. Сам не как не соображу как получить этот список.. прошу помощи..
Нужно полочить список разделов жеского диска на C++
по порядковому номеру можно получить функциями
FindFirstVolume
FindNextVolume
возможно как то так:
функцией GetLogicalDrives можно получить набор бит,в котором 1 значит что соответствующая букваиспользуется типа:
1001... соответствует что A используется B,C - несипользуются D - используется.
Затем функцией GetVolumeNameForVolumeMountPoint можно получить имя тома соответствующей бувкы, буква передается первым параметром ввиде" D:\",наверно как то так:
надо сравнить имя тома котрое получено функциями FindFirstVolume, FindNextVolume с именем полученным от GetVolumeNameForVolumeMountPoint - в первом случае имена идут по порядку,во втором они привязаны к логическим именам, значит можно получить соотвествие логического имени и номера.Записать в файл думаю непроблема. Про определенного жесткого диска возможно можно определить по имени тома(неуверен тут)
Вот вобщем кое-что:
написано криво тока поди ))
FindFirstVolume
FindNextVolume
возможно как то так:
Код: Выделить всё
hdf=FindFirstVolume((LPTSTR)str,255);
if(hdf!=INVALID_HANDLE_VALUE){
do cout<<str<<endl;
while(FindNextVolume(hdf,(LPTSTR)str,255)!=0);
FindVolumeClose(hdf);
}
1001... соответствует что A используется B,C - несипользуются D - используется.
Затем функцией GetVolumeNameForVolumeMountPoint можно получить имя тома соответствующей бувкы, буква передается первым параметром ввиде" D:\",наверно как то так:
Код: Выделить всё
name = GetLogicalDrives();
for(i = 0;i < 26;i++){
if(((name>>i)&1)){
str0[0]=65+i;
str0[1] = ':';
str0[2] = '\\';
str0[3] = 0;
GetVolumeNameForVolumeMountPoint((LPTSTR)str0,(LPTSTR)str,255);
cout <<str0[0]<<" "<<str<<endl;
}
}
Вот вобщем кое-что:
Код: Выделить всё
#include "windows.h"
#include <iostream>
#define _WIN32_WINNT 0x0500
using std::cout;
using std::endl;
HANDLE (WINAPI * FindFirstVolume )(LPTSTR,DWORD);
BOOL (WINAPI * FindNextVolume )(HANDLE,LPTSTR,DWORD);
BOOL (WINAPI * FindVolumeClose )(HANDLE);
BOOL (WINAPI * GetVolumeNameForVolumeMountPoint)(LPCTSTR,LPTSTR,DWORD);
int main(){
HANDLE hdf;
HMODULE hmod;
DWORD name;
int i,n,j;
char str[26][255],str1[26][255];
char str0[26][4];
if((hmod = LoadLibrary(TEXT("Kernel32.dll")))){
FindFirstVolume =(HANDLE(WINAPI *)(LPTSTR,DWORD)) GetProcAddress(hmod,"FindFirstVolumeA");
FindNextVolume =(BOOL (WINAPI *)(HANDLE,LPTSTR,DWORD))GetProcAddress(hmod,"FindNextVolumeA");
FindVolumeClose =(BOOL (WINAPI *)(HANDLE)) GetProcAddress(hmod,"FindVolumeClose");
GetVolumeNameForVolumeMountPoint = (BOOL(WINAPI *)(LPCTSTR,LPTSTR,DWORD))
GetProcAddress(hmod,"GetVolumeNameForVolumeMountPointA");
if(!(FindFirstVolume&&FindNextVolume&&FindVolumeClose&&GetVolumeNameForVolumeMountPoint)){
cout<<"error Load from kernel32.dll"<<endl;
return 2;
}
/////////////////////////////////
hdf=FindFirstVolume((LPTSTR)str[(n=0)],255);
if(hdf!=INVALID_HANDLE_VALUE){
do
cout<<str[n]<<endl;
while(FindNextVolume(hdf,(LPTSTR)str[++n],255)!=0);
FindVolumeClose(hdf);
}
else{
cout<<"Error FindFirstVolume"<<endl;
return 3;
}
/////////////////////////////////
name = GetLogicalDrives();
for(i=j=0;i<26;i++){
if(((name>>i)&1)){
str0[j][0]=65+i;
str0[j][1]=':';
str0[j][2]='\\';
str0[j][3]=0;
GetVolumeNameForVolumeMountPoint((LPTSTR)str0[j],(LPTSTR)str1[j],255);
cout<<str0[j][0]<<" "<<str1[j]<<endl;
j++;
}
}
}
else{
cout<<"error Load kernel32.dll"<<endl;
return 1;
}
return 0;
}
Код: Выделить всё
#include "windows.h"
#include <iostream>
#define _WIN32_WINNT 0x0500
using std::cout;
using std::endl;
HANDLE (WINAPI * FindFirstVolume )(LPTSTR,DWORD);
BOOL (WINAPI * FindNextVolume )(HANDLE,LPTSTR,DWORD);
BOOL (WINAPI * FindVolumeClose )(HANDLE);
BOOL (WINAPI * GetVolumeNameForVolumeMountPoint)(LPCTSTR,LPTSTR,DWORD);
int main(){
HANDLE hdf;
HMODULE hmod;
DWORD name;
int i,n,j;
char str[26][255],str1[26][255];
char str0[26][4];
if((hmod = LoadLibrary(TEXT("Kernel32.dll")))){
FindFirstVolume =(HANDLE(WINAPI *)(LPTSTR,DWORD)) GetProcAddress(hmod,"FindFirstVolumeA");
FindNextVolume =(BOOL (WINAPI *)(HANDLE,LPTSTR,DWORD))GetProcAddress(hmod,"FindNextVolumeA");
FindVolumeClose =(BOOL (WINAPI *)(HANDLE)) GetProcAddress(hmod,"FindVolumeClose");
GetVolumeNameForVolumeMountPoint = (BOOL(WINAPI *)(LPCTSTR,LPTSTR,DWORD))
GetProcAddress(hmod,"GetVolumeNameForVolumeMountPointA");
if(!(FindFirstVolume&&FindNextVolume&&FindVolumeClose&&GetVolumeNameForVolumeMountPoint)){
cout<<"error Load from kernel32.dll"<<endl;
return 2;
}
/////////////////////////////////
hdf=FindFirstVolume((LPTSTR)str[(n=0)],255);
if(hdf!=INVALID_HANDLE_VALUE){
do
1;//cout<<str[n]<<endl;
while(FindNextVolume(hdf,(LPTSTR)str[++n],255)!=0);
FindVolumeClose(hdf);
}
else{
cout<<"Error FindFirstVolume"<<endl;
return 3;
}
/////////////////////////////////
name = GetLogicalDrives();
for(i=j=0;i<26;i++){
if(((name>>i)&1)){
str0[j][0]=65+i;
str0[j][1]=':';
str0[j][2]='\\';
str0[j][3]=0;
GetVolumeNameForVolumeMountPoint((LPTSTR)str0[j],(LPTSTR)str1[j],255);
//cout<<str0[j][0]<<" "<<str1[j]<<endl;
j++;
}
}
/////////////////////////////////
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(!lstrcmpA((LPCSTR)str[i],(LPCSTR)str1[j]))
cout<<i+1<<": "<<str0[j]<<endl;
}
else{
cout<<"error Load kernel32.dll"<<endl;
return 1;
}
return 0;
}
про определенный диск непридумал как сделать.
Ссылка по теме: http://msdn.microsoft.com/en-us/library ... S.85).aspx