Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как определить в каком CD-Rom приводе


Автор: Serhik_z 17.3.2006, 18:48
Здравствуйте!
В системном блоке находится несколько Cd-Rom приводов.
Как определить в каком CD-Rom приводе находится диск, и как скопировать файл с этого CD-Rom, на диск С:

smile smile smile

Автор: Poseidon 17.3.2006, 18:57
Я так понимаю, буквы С-дисков известны. Тогда нужно просто обратится к нужнову файлу. Если диск не тот, то получаем ошибку чтения файла "Файл не найден", по каторой можно судить, что "не тот CD-Rom". Смотрим на другой диск...

Автор: Snowy 17.3.2006, 19:14
А если есть 4 CD-ROM и в каждом по диску?

Автор: Poseidon 17.3.2006, 19:24
Snowy, я тоже об этом подумал. А еще подума, а что если в каждом по одинаковому диску smile
А что если структура файлов и папок одинакова, а сами файлы разные. В общем, вопрос требует массу уточнений.

Автор: Serhik_z 17.3.2006, 19:26
smile smile smile

Автор: bems 17.3.2006, 19:29
Зачем тебе?
Если ещешь свой диск используй файл с сигнатурой.
Если хочешь внічку скопировать чужой - храни данные об используемых ранее в какой-то базе (например в реестре)

Автор: Serhik_z 17.3.2006, 19:41
Если все диски одинаковы и даже файлы одинаковы,
то по умолчании с первого Cd привода (или буквы по алфавиту) - (E F H K). - и копировать только с одного диска.
E - первая по умолчании.
(C D - Винты)
smile smile smile

Автор: bems 17.3.2006, 19:48
CreateFile c параметром dwDesiredAccess=0 а потом DeviceIOControl
Цитата
Disk Devices
Windows NT: You can use the CreateFile function to open a disk drive or a partition on a disk drive. The function returns a handle to the disk device; that handle can be used with the DeviceIOControl function. The following requirements must be met in order for such a call to succeed:

· The caller must have administrative privileges for the operation to succeed on a hard disk drive.
· The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero. For example:

String Meaning
\\.\PHYSICALDRIVE2 Obtains a handle to the third physical drive on the user's computer.


· The lpFileName string should be \\.\x: to open a floppy drive x or a partition x on a hard disk. For example:

String Meaning
\\.\A: Obtains a handle to drive A on the user's computer.
\\.\C: Obtains a handle to drive C on the user's computer.

и раскручивай дальше по MSDN

Автор: Snowy 17.3.2006, 19:51
Вот. Нацарапал код, который ищет все CD-ROM в которых есть диск.
Функции возвращают строку, в которой каждый символ - имя диска
Код
function GetCDRoms: string; // Возвращает строку - список CD-ROM'ов
var
  d: dword;
  b: byte;
begin
  result := '';
  d := GetLogicalDrives;
  for b := 0 to 31 do
    if d and (1 shl b) > 0 then
      if GetDriveType(PChar(chr(b+65)+':\')) = DRIVE_CDROM then
        result := result + chr(b+65);
end;

function GetCDExist: string; // Возвращает список CD-ROM в которых есть диск
var
  i: integer;
  buf: array[0..MAX_PATH] of char;
  d:  dword;
begin
  result := GetCDRoms;
  SetErrorMode(SEM_FAILCRITICALERRORS);
  for i := Length(result) downto 1 do
    if not GetVolumeInformation(PChar(result[i] + ':\'), @buf, MAX_PATH,
                                nil, d, d, @buf, MAX_PATH) then
      Delete(result, i, 1);
end;


Пример:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetCDExist); // Показать строку со списком CD-ROM с диском внутри
end;

Добавлено @ 19:55
Копируем файл с CD на диск C:
Код
var
  i: integer;
  s: string;
begin
  s := GetCDExist;
  for i := 1 to Length(s) do
    CopyFile(PChar(s[i] + ':\File.txt'), 'C:\File.txt', false);
end;

Автор: bems 17.3.2006, 19:58
Цитата(Snowy @ 17.3.2006, 19:51 Найти цитируемый пост)
for b := 0 to 25 do
    if d and (1 shl b) > 0 then
      if GetDriveType(PChar(chr(b+65)+':\')) = DRIVE_CDROM then
        result := result + chr(b+65);
а не проще
Код

for b := 'A' to 'Z' do


Автор: Snowy 17.3.2006, 20:02
Нет, не проще.
Зачем мне определять тип несуществующих или сетевых дисков?
Интересуют только локальные. Остальные и опрашивать незачем.

Автор: bems 17.3.2006, 20:04
Цитата(Snowy @ 17.3.2006, 19:51 Найти цитируемый пост)
for b := 0 to 31 do
    if d and (1 shl b) > 0 then
      if GetDriveType(PChar(chr(b+65)+':\')) = DRIVE_CDROM then
        result := result + chr(b+65);
тогда построчно, плиз

Автор: Snowy 17.3.2006, 20:06
Что построчно?

Автор: bems 17.3.2006, 20:08
твой код. и смысл каждого приведения типов, для танкистов (меня например)

Автор: Snowy 17.3.2006, 20:14
Код
for b := 0 to 31 do // в d у нас 32 бита. Перебираем от первого до последнего.
    if d and (1 shl b) > 0 then // если бит № b установлен - значит есть такой логический диск в системе
      if GetDriveType(PChar(chr(b+65)+':\')) = DRIVE_CDROM then // если буква_диска_':\' - CD-ROM, то 
        result := result + chr(b+65); // добавляем эту букву в результирующую строку

Автор: Poseidon 17.3.2006, 20:29
Цитата(Snowy @ 17.3.2006, 18:51 Найти цитируемый пост)
var
  i: integer;
  s: string;
begin
  s := GetCDExist;
  for i := 1 to Length(s) do
    CopyFile(PChar(s[i] + ':\File.txt'), 'C:\File.txt', false);
end;


Я бы еще добвил if FileExists(PChar(s[i] + ':\File.txt') then CopyFile... smile

Автор: Snowy 17.3.2006, 21:24
Цитата(Poseidon @ 17.3.2006, 20:29 Найти цитируемый пост)
if FileExists
Можно. Но необязательно.
Если файла не будет, то и копировать не будет.
Просто вернет 0. Ну и фиг с ним.

Автор: bems 17.3.2006, 22:41
Цитата(Snowy @ 17.3.2006, 21:24 Найти цитируемый пост)
Если файла не будет, то и копировать не будет.
Просто вернет 0. Ну и фиг с ним.
тогда и все 26 букв перебрать можно. нету диска ну и фиг с ним

Автор: Snowy 17.3.2006, 23:53
Цитата(bems @ 17.3.2006, 22:41 Найти цитируемый пост)
тогда и все 26 букв перебрать можно. нету диска ну и фиг с ним
Можно. Но не обязательно.
И так и перетак, но работать будет.
Вариации всякие возможны. Я представил свою. Она мне нравится.
Но и шаг влево и вправо - не преступление.

Автор: Guedda 18.3.2006, 02:56
Если он будет перебирать все буквы, тогда есть вероятность того, что файлсуществует на локальном диске, а не на CD-роме. Так что Snowy прав, и этот вариант подходит лучше всего.

Автор: bems 19.3.2006, 09:33
Цитата(Guedda @ 18.3.2006, 02:56 Найти цитируемый пост)
Если он будет перебирать все буквы, тогда есть вероятность того, что файлсуществует на локальном диске, а не на CD-роме. Так что Snowy прав, и этот вариант подходит лучше всего.


Цитата(Snowy @ 17.3.2006, 20:14 Найти цитируемый пост)
GetDriveType(...) = DRIVE_CDROM


но в общем

Цитата(Snowy @ 17.3.2006, 23:53 Найти цитируемый пост)
Вариации всякие возможны. Я представил свою. Она мне нравится.
Так что давайте попітаемся остановиться smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)