![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перечислить буквы на винчестере [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Andr-04 © (2005-08-07 11:21:00)Как определить буквы локальных дисков в системе, которые принадлежат определённому винчестеру? Или определить винчестер (его название, серийный номер или что-либо ещё), на котором располагается определённый локальный диск (например, C:)?
Andr-04 (2005-08-08 09:36:00) [1]Возможно, но я знаю только как при помощи этих функций получить информацию о винчестерах (их имена, сер. номера и т.д.). А о буквах в системе, назначенных разделам каждого винчестера, при помощи этого как узнать я не знаю (возможно, это и невозможно - нужны ещё некоторые другие). Если же я не прав, и это узнать при помощи данных функций можно - напишите как.
Lamer@fools.ua (2005-08-08 08:56:00) [2]Для Windows линейки NT:
CreateFile() + DeviceIOControl()
должны помочь.
Andr-04 (2005-08-08 08:32:00) [3]Приведённый код возвращает информацию (в т.ч. сер. номер) для каждого локального диска как раздела, а не винчестера в целом, на котором располагается данный раздел! Поэтому данный код, к сожалению, не подходит... Вообще, GetVolumeInformation (используется в данном коде) к винчестеру отношения не имеет! Надо именно связать разделы винчестера (точнее, их буквы в системе) с винчестером, на котором они все располагаются (например, если подключено 2 винчестера, то одна группа локальных дисков (например, C:\, D:\, E:\) будет возвращать имя и сер. номер (или др. информацию - не важно) одного винчестера, а другая группа локальных дисков (например, F:\, G:\) будет возвращать имя и сер. номер (или др. информацию - не важно) другого винчестера). Или же для каждого винчестера отдельно определить все буквы в системе, назначенные каждому из его разделов (само расположение разделов не важно - важен лишь сам факт их принадлежности).
GanibalLector (2005-08-07 23:27:00) [4]Вот,мой код 2 годичной давности ;) Попрошу без комментариев(они уже были). Менять принципиально ничего не буду!!!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
const
DriveConst: array[1..26] of DWord =
($1, $2, $4, $8,
$10, $20, $40, $80,
$100, $200, $400, $800,
$1000, $2000, $4000, $8000,
$10000, $20000, $40000, $80000,
$100000, $200000, $400000, $800000,
$1000000, $2000000);
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Bevel1: TBevel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var QQ,i:DWord;
begin
QQ:=GetLogicalDrives();
for i:=1 to 26 do
if (QQ and DriveConst[i])>0 then
Combobox1.Items.Add(chr($40+i)+':\');
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var st:string;
VolumeName,FileSystemName : array [0..MAX_PATH-1] of Char;
VolumeSerialNumber,MaximumComponentLength,FileSystemFlags:DWord;
SectorsPerCluster,BytesPerSector,NumberOfFreeClusters,TotalNumberOfClusters:DWord;
begin
SetErrorMode(SEM_FAILCRITICALERRORS);
case GetDriveType(PChar(Combobox1.Text)) of
0: st:='Type :'+chr(09)+chr(09)+chr(09)+'Unknown'+#10#13;
1: st:='Type :'+chr(09)+chr(09)+chr(09)+'No_ROOT_DIR'+#10#13; // if RootPathName=nil
DRIVE_REMOVABLE: st:='Type :'+chr(09)+chr(09)+chr(09)+'Flopy'+#10#13;
DRIVE_FIXED: st:='Type :'+chr(09)+chr(09)+chr(09)+'Hard'+#10#13;
DRIVE_REMOTE: st:='Type :'+chr(09)+chr(09)+chr(09)+'Remote'+#10#13;
DRIVE_CDROM : st:='Type :'+chr(09)+chr(09)+chr(09)+'CD-ROM'+#10#13;
DRIVE_RAMDISK: st:='Type :'+chr(09)+chr(09)+chr(09)+'RAM-Disk'+#10#13;end;
st:=st+#10#13;
if GetVolumeInformation(Pchar(Combobox1.Text),VolumeName,MAX_PATH,
@VolumeSerialNumber,MaximumComponentLength,FileSystemFlags,FileSystemName,MAX_PATH)=true then
begin
st:=st+'Name :' +chr(09)+chr(09)+chr(09)+VolumeName+#10#13;
st:=st+'Serial :' +chr(09)+chr(09)+chr(09)+inttohex(VolumeSerialNumber,8)+#10#13;
st:=st+'Length :' +chr(09)+chr(09) +inttostr(MaximumComponentLength)+#10#13;
st:=st+'File system :'+chr(09)+chr(09) +FileSystemName+#10#13;
end
else st:=st+'Drive not ready'+#10#13; //ShowMessage(SysErrorMessage(GetLastError));
st:=st+#10#13;
if GetDiskFreeSpace(Pchar(Combobox1.Text),SectorsPerCluster,
BytesPerSector,NumberOfFreeClusters,TotalNumberOfClusters)=true then
begin
st:=st+'SectorsPerCluster :'+chr(09)+inttostr(SectorsPerCluster)+#10#13;
st:=st+'BytesPerSector : '+chr(09)+inttostr(BytesPerSector)+#10#13;
st:=st+#10#13;
st:=st+'FreeClusters : '+chr(09)+chr(09)+inttostr(NumberOfFreeClusters)+#10#13;
st:=st+'BusyClusters :'+chr(09)+chr(09)+inttostr(TotalNumberOfClusters-NumberOfFreeClusters)+#10#13;
st:=st+'TotalClusters :'+chr(09)+chr(09)+inttostr(TotalNumberOfClusters)+#10#13;
st:=st+#10#13;
st:=st+'FreeBytes :'+chr(09)+chr(09)+inttostr(NumberOfFreeClusters*(Int64(BytesPerSector*SectorsPerCluster)))+#10#13;
st:=st+'Busy :'+chr(09)+chr(09)+chr(09)+inttostr(TotalNumberOfClusters*(Int64(BytesPerSector*SectorsPerCluster))-
NumberOfFreeClusters*(Int64(BytesPerSector*SectorsPerCluster)))+#10#13;
st:=st+'TotalBytes :'+chr(09)+chr(09)+inttostr(TotalNumberOfClusters*(Int64(BytesPerSector*SectorsPerCluster)))+#10#13;
end;
messagedlg(Pchar(st),MtInformation,[MbOk],0);
end;
end.
Andr-04 (2005-08-07 22:38:00) [5]Удалено модератором
Примечание: Не надо спамить
Andr-04 (2005-08-07 20:46:00) [6]Удалено модератором
Andr-04 (2005-08-07 20:34:00) [7]Там того, что нужно, нету...
3DxFantastika (2005-08-07 19:52:00) [8]По дискам инфа была:
http://home.earthlink.net/~akonshin/
Andr-04 (2005-08-07 19:47:00) [9]Неужели никто не знает???