![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение расположения файла на диске (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);
Интересно, и какой из передаваемых параметров, по вашему, является "нужным сектором"?