C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Чтение с физического диска
esh
Отправлено: 23.08.2005, 03:06


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Нужно добавить в программу возможность работы с дисками. Диск открываю с помощью
FileOpen("\\\\.\\C:",...);
Вроде работает, но:
1) не могу определить размер диска с помощью GetFileSize.
2) не могу открыть \\.\PHYSICALDRIVE0.
Эти проблемы имхо решить можно, смотрю в сторону GetDiskFreeSpaceEx, DeviceIoControl и использования
CreateFile вместо FileCreate (т.к. FileCreate по сути является оберткой CreateFile,
проблем возникнуть не должно, имхо).

Основная проблема -- нужно сделать список, в котором будут все логические и физические устройства
(как в WINHEX):

Logical:
A: Floppy disk
C: SYSTEM
D: SOFT
H: CD-ROM Drive
Physical:
Floppy disk 1
Hard Disk 1
Hard Disk 2
CD-ROM 1
и т.д.
Doga
Отправлено: 23.08.2005, 10:36


Мастер участка

Группа: Участник
Сообщений: 575



Используйте WinAPI:

CoInitializeEx,
SHGetDesktopFolder,
SHGetSpecialFolderLocation,
IShellFolder->GetDisplayName,
IShellFolder->GetDisplayNameOf,
IShellFolder->ParseDisplayName,
IShellFolder->BindToObject,
IShellFolder->EnumObjects,
IShellFolder->GetAttributesOf,
ConcatPIDLs,
CoUninitialize

- вот необходимый набор средтв для Вашей задачи, по крайней мере для логических устройств. Описание в MSDN.

А для начала можете заглянуть сюда:
http://www.akzhan.midi.ru/devcorner/articl...-Namespace.html
timson
Отправлено: 23.08.2005, 10:56


Станционный диспетчер

Группа: Участник
Сообщений: 82



msdn!!!
CODE
/* The code of interest is in the subroutine GetDriveGeometry. The
  code in main shows how to interpret the results of the IOCTL call. */

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>

BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
 HANDLE hDevice;               // handle to the drive to be examined
 BOOL bResult;                 // results flag
 DWORD junk;                   // discard results

 hDevice = CreateFile("\.\PhysicalDrive0",  // drive to open
                   0,                // no access to the drive
                   FILE_SHARE_READ | // share mode
                   FILE_SHARE_WRITE,
                   NULL,             // default security attributes
                   OPEN_EXISTING,    // disposition
                   0,                // file attributes
                   NULL);            // do not copy file attributes

 if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
 {
   return (FALSE);
 }

 bResult = DeviceIoControl(hDevice,  // device to be queried
     IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
                            NULL, 0, // no input buffer
                           pdg, sizeof(*pdg),     // output buffer
                           &junk,                 // # bytes returned
                           (LPOVERLAPPED) NULL);  // synchronous I/O

 CloseHandle(hDevice);

 return (bResult);
}

int main(int argc, char *argv[])
{
 DISK_GEOMETRY pdg;            // disk drive geometry structure
 BOOL bResult;                 // generic results flag
 ULONGLONG DiskSize;           // size of the drive, in bytes

 bResult = GetDriveGeometry (&pdg);

 if (bResult)
 {
   printf("Cylinders = %I64d\n", pdg.Cylinders);
   printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
   printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
   printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);

   DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
     (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
   printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
          DiskSize / (1024 * 1024));
 }
 else
 {
   printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
 }

 return ((int)bResult);
}
esh
Отправлено: 23.08.2005, 13:27


Дежурный стрелочник

Группа: Участник
Сообщений: 71



То Doga: Спасибо, сейчас буду пробовать.

То timson: Так я и говорил, что "смотрю в сторону GetDiskFreeSpaceEx, DeviceIoControl", а msdn у меня и так открыта на странице "Calling DeviceIoControl"...

Вернуться в Вопросы программирования в C++Builder