Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение расположения файла на диске (CD|DVD)


abun ©   (2009-11-15 12:34:00) 

Как определить расположение файла на диске CD или DVD?
Чтобы потом можно было воспользоваться кодом:

   //  Перемещаем указатель на нужный сектор:
   SetFilePointer (h, pos, nil, FILE_BEGIN);
   //  Читаем сектор в буфер:
   ReadFile (h, Buffer, bufsize, tmp, nil);

Т.е. нужно указать значение Pos:cardinal;

Как его найти?


abun   (2009-11-17 14:58:00) [1]

кул-инфа по теме: http://wasm.ru/article.php?article=lockfileswork


brother   (2009-11-17 11:52:00) [2]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1254377124&n=5&p=1
9 пост ;)
Рипли нравится тема))))))))


Riply   (2009-11-17 09:36:00) [3]

> [0] abun ©   (15.11.09 12:34)
> Как его найти?

IMHO, самый простой вариант попробовать через: ZwQueryInformationFile(..., FileInternalInformation)
Но и в нем есть пара подводных камней, типа возврата "не совсем настоящего значения" :)


brother   (2009-11-17 09:01:00) [4]

> а может и не имеет).

имхо так, ибо сабж явно на это указывает


Юрий Зотов   (2009-11-17 08:20:00) [5]

Тут даже дело не в том, на каком уровне (логическом или физическом) требуется доступ. Дело тут в самом принципе. Если вникнуть в суть вопроса, то она сводится к следующему - как узнать позицию, на которую нужно установить указатель записи/чтения?

Ответ очевиден - или никак, или исходя из какой-то дополнительной информации (которую автор вопроса не сообщает, а может и не имеет).


brother   (2009-11-17 05:00:00) [6]

> Перерыл всю тему, ничего толкового не нашел - потратил только
> битый час!!!

мои последние ссылки...

> что PHYSICALDRIVE - это типо если в системе установлены
> 2 или больше приводов (HDD или CD-Rom),

нет, это физическая железка (HDD0, HDD1, DVD0, DVD1 ...)

> А второй вариант - по имени логического диска - я его и
> использую

да по имени диска...
НО: все эти манипуляции приводяк к тому, что устройство открывается как один большой файл и доступ идет в обход файловой системы, не знаю, можно ли прочитать сектора ФС через
DiskString :=  Format ('\\.\%s',[DrCh+':']),
но через
DiskString := Format ('\\.\PHYSICALDRIVE%s', [IntToStr(x)]);
их можно точно прочитать, и MBR тоже...
твоя задача:
1. прочитать ФС побайтно (а для этого надо знать структуру ФС и где она физически расположена на носителе)
2. найти все вхождения в ней интересующего тебя файла (вот там ты и узнаешь, с какого по какой сектор расположен интересующий тебя файл, есть ли фрагментация итд итп.)
3. как помню: для CD, DVD используется CDFS файловая система, на счет ее фрагментации - не знаю, скорее всего нет...
имхо, сложная тема для тебя... но: удачи!
зы ты так и не сказал зачем это нужно? может всеж на уровне ФС можно решить задачу?


abun   (2009-11-16 14:12:00) [7]


> brother ©   (16.11.09 07:41) [6]
> > Т.е. если я буду знать адрес нужного сектора, то адрес
> надо > умножить на количество байт в секторе.вообще этого
> не достаточно ибо:1. файл может быть фрагментирован, а доступ
> идет в обход ФС2. этот код справедлив для любых носителей3.
>  как файл откываешь? DiskString := Format ('\\.\PHYSICALDRIVE%s',
> [IntToStr(x)]); // x -- номер привода или DiskString :=
> Format ('\\.\%s',[DrCh+':']);// DrCh -- Буква логического
> диска... если нужно читать по файловой системе4. задача
> какая?

Может, я чет не понимаю, но я понимаю так: что PHYSICALDRIVE - это типо если в системе установлены 2 или больше приводов (HDD или CD-Rom), и обращение идет именно к одному из них. А второй вариант - по имени логического диска - я его и использую. Кстати, для CDROM, как я понимаю, оба варианта должны быть, в принципе, одинаково работоспособны.


abun   (2009-11-16 14:08:00) [8]

Какая фрагментация на CD или DVD???
Там очевидно идет последовательное чтение-запись.
> brother ©   (16.11.09 07:50) [7]
> посмотри тут: http://www.delphimaster.ru/cgi-bin/forum.pl?
> n=5там последние мои ссылки и ты поймешь, что в том случае
> открывается файл на чтеие байт и ты должен:прочитав структуру
> ФС выявить с какого по какой сектора расположен нужный тебе
> файл, а структура ФС это уже другое...

Перерыл всю тему, ничего толкового не нашел - потратил только битый час!!!


> Anatoly Podgoretsky ©   (15.11.09 15:57) [5]
> > abun  (15.11.2009 13:35:02)  [2]Вряд ли это получится,
>  пока тема открыта каждый имеет право писать в нее, тебе
> видимо надо в платную службу подержки.

Какую службу поддержки? Куда и почему?


RWolf   (2009-11-16 10:40:00) [9]


> Сейчас он там, а через пару колов времени его уже нет.

ну, на CD/DVD-то он всегда будет там, куда положили.


brother   (2009-11-16 10:30:00) [10]

> Файл не обязан располагаться последовательно.

дык я об этом же:

> 1. файл может быть фрагментирован, а доступ идет в обход
> ФС

просто, если прочитать по фат: сколько фрагментов и где ;)


Leonid Troyanovsky   (2009-11-16 10:05:00) [11]


> brother ©   (16.11.09 07:50) [7]

> прочитав структуру ФС выявить с какого по какой сектора
> расположен нужный тебе файл,

Файл не обязан располагаться последовательно.

> abun ©   (15.11.09 12:34)  

> Как его найти?

Бессмысленное действо.
Сейчас он там, а через пару колов времени его уже нет.

--
Regards, LVT.


brother   (2009-11-16 07:50:00) [12]

посмотри тут:
http://www.delphimaster.ru/cgi-bin/forum.pl?n=5
там последние мои ссылки и ты поймешь, что в том случае открывается файл на чтеие байт и ты должен:
прочитав структуру ФС выявить с какого по какой сектора расположен нужный тебе файл, а структура ФС это уже другое...


brother   (2009-11-16 07:41:00) [13]

> Т.е. если я буду знать адрес нужного сектора, то адрес надо
> умножить на количество байт в секторе.

вообще этого не достаточно ибо:
1. файл может быть фрагментирован, а доступ идет в обход ФС
2. этот код справедлив для любых носителей
3. как файл откываешь?
DiskString := Format ('\\.\PHYSICALDRIVE%s',[IntToStr(x)]);// x -- номер привода
или
DiskString := Format ('\\.\%s',[DrCh+':']);// DrCh -- Буква логического диска... если нужно читать по файловой системе
4. задача какая?


Anatoly Podgoretsky   (2009-11-15 15:57:00) [14]

> abun  (15.11.2009 13:35:02)  [2]

Вряд ли это получится, пока тема открыта каждый имеет право писать в нее, тебе видимо надо в платную службу подержки.


0x00FF00   (2009-11-15 15:06:00) [15]

abun,
Сдаётся мне, Вы что-то путаете.
Таким способом нельзя читать носитель посекторно.
Предназначение вышеуказанного SetFilePointer — указать позицию чтения/записи УЖЕ в файле, т.е. в некоей логической сущности, не привязанной к носителю информации.


Юрий Зотов   (2009-11-15 14:30:00) [16]

> abun ©   (15.11.09 12:34)  

> Как определить расположение файла на диске CD или DVD?

Уточните - что имеется в виду под термином "расположение файла"?


abun   (2009-11-15 13:35:00) [17]


> >    //  Перемещаем указатель на нужный сектор:>    SetFilePointer
> (h, pos, nil, FILE_BEGIN);Интересно, и какой из передаваемых
> параметров, по вашему, является "нужным сектором"?

Я чет не понял? Меня подловить хочешь или как?
Да, в переменной Pos значение указывается в байтах. Т.е. если я буду знать адрес нужного сектора, то адрес надо умножить на количество байт в секторе. Это очевидно.

Господа, попрошу без лишних обсуждений. Если есть ответ или совет, или подсказка какая-либо, то прошу!


Плохиш   (2009-11-15 13:03:00) [18]


>    //  Перемещаем указатель на нужный сектор:
>    SetFilePointer (h, pos, nil, FILE_BEGIN);

Интересно, и какой из передаваемых параметров, по вашему, является "нужным сектором"?


Наверх

Титульная страница Поиск, карта сайта Написать письмо