Страница 1 из 1

Нужно полочить список разделов жеского диска на C++

Добавлено: 30 янв 2010, 07:26
Rock
Здравствуйте! Нужно получить список разделов определенного жесткого диска и записать его в фаил txt, т.е. получить список разделов примерно вот в таком виде:
1 - D
2 - C
3 - E

Во общем чтобы знать как присвоены буквы разделов по порядковому номеру. Сам не как не соображу как получить этот список.. прошу помощи..

Re: Нужно полочить список разделов жеского диска на C++

Добавлено: 30 янв 2010, 15:53
rrrFer
по порядковому номеру можно получить функциями
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);
		}
функцией GetLogicalDrives можно получить набор бит,в котором 1 значит что соответствующая букваиспользуется типа:
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;
		}
	}
надо сравнить имя тома котрое получено функциями FindFirstVolume, FindNextVolume с именем полученным от GetVolumeNameForVolumeMountPoint - в первом случае имена идут по порядку,во втором они привязаны к логическим именам, значит можно получить соотвествие логического имени и номера.Записать в файл думаю непроблема. Про определенного жесткого диска возможно можно определить по имени тома(неуверен тут)
Вот вобщем кое-что:

Код: Выделить всё

#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;
}
написано криво тока поди ))

Re: Нужно полочить список разделов жеского диска на C++

Добавлено: 30 янв 2010, 17:59
rrrFer

Код: Выделить всё

#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