Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить в каком CD-Rom приводе, находится диск 
:(
    Опции темы
Serhik_z
  Дата 17.3.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 108
Регистрация: 4.12.2004

Репутация: нет
Всего: нет



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

smile smile smile
PM MAIL   Вверх
Poseidon
Дата 17.3.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 17.3.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А если есть 4 CD-ROM и в каждом по диску?
PM MAIL   Вверх
Poseidon
Дата 17.3.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Serhik_z
Дата 17.3.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 108
Регистрация: 4.12.2004

Репутация: нет
Всего: нет



smile smile smile
PM MAIL   Вверх
bems
Дата 17.3.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Serhik_z
Дата 17.3.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 108
Регистрация: 4.12.2004

Репутация: нет
Всего: нет



Если все диски одинаковы и даже файлы одинаковы,
то по умолчании с первого Cd привода (или буквы по алфавиту) - (E F H K). - и копировать только с одного диска.
E - первая по умолчании.
(C D - Винты)
smile smile smile
PM MAIL   Вверх
bems
Дата 17.3.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Snowy
Дата 17.3.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вот. Нацарапал код, который ищет все 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;

PM MAIL   Вверх
bems
Дата 17.3.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(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




--------------------
Обижено школьников: 8
PM MAIL   Вверх
Snowy
Дата 17.3.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Нет, не проще.
Зачем мне определять тип несуществующих или сетевых дисков?
Интересуют только локальные. Остальные и опрашивать незачем.
PM MAIL   Вверх
bems
Дата 17.3.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(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);
тогда построчно, плиз



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Snowy
Дата 17.3.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Что построчно?
PM MAIL   Вверх
bems
Дата 17.3.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



твой код. и смысл каждого приведения типов, для танкистов (меня например)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Snowy
Дата 17.3.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код
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); // добавляем эту букву в результирующую строку

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.