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

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

Read Disk [D7, XP]


Страницы:   1 2

Cj ©   (2007-06-28 17:40:00) 

Подскажите как можно по быстрее считать диск, а то ReadFile уж больно медленная.


Dimaxx   (2007-06-29 16:12:00) [1]


>count:=1;
>for h:=1  to data.RowCount-1 do
>begin
>  count:=count+1;
>  s:=s+inttohex(a[count],2);
>end;

Лучче брось это дело, раз пишешь такие вот "орехи". Не проще было:

for h:=1 to data.RowCount-1 do
begin
 s:=s+inttohex(a[h+1],2);
end;


homm   (2007-06-29 07:22:00) [2]

> [26] Cj ©   (29.06.07 04:46)


Ну а теперь вот так попробуй, и скажи долго ли работает ReadFile.

var
f:cardinal;
a:array[1..1024]of byte;
r:cardinal;
s:string;
count:cardinal;
begin
f:=createfile (pchar('\\.\'+edit1.Text+':'),
           GENERIC_READ,FILE_SHARE_READ,
           nil,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
readfile(f,a,sizeof(a),r,nil);
CloseHandle(f);
end;


SlymRO   (2007-06-29 06:31:00) [3]

ЮЮ ©   (29.06.07 6:02) [29]
писал в блокноте... не проверял естесно...


ЮЮ   (2007-06-29 06:02:00) [4]

> [28] SlymRO ©   (29.06.07 05:54)

Лучше. Но
1) не грех воспользоваться r, ибо могли считать и меньше
  SetLength(s, 2 * r);
 for h := 0 to r do

2) s[h*2] === 0 на первом шаге итерации
 s[2 * h + 1]


SlymRO   (2007-06-29 05:54:00) [5]

а так?
f:cardinal;
a:array[0..BootSize-1]of byte;
r:cardinal;
s,ss:string;
count:cardinal;
begin
f:=createfile (pchar('\\.\'+edit1.Text+':'),
            GENERIC_READ,FILE_SHARE_READ,
            nil,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
readfile(f,a,sizeof(a),r,nil);
CloseHandle(f);
SetLength(s,sizeof(a)*2);
for h:=Low(a) to High(a) do
begin
 ss:=inttohex(a[h],2);
 move(ss[1],s[h*2],2);
end;
end;


ЮЮ   (2007-06-29 05:32:00) [6]

> s:=s+inttohex(a[count],2);

1024*1024 раз перераспределять память - не может быть быстро.


> //считать один метр

непосредственно из файла считтывается только один раз 1024 байта - до цикла. В цикле только дерганье памяти. где считывание?


> a:array[1..1024]of byte

a[count], где count 1...1024*1024
за границы массива не страшно вылазить? :)

И после всего этого, виновата ReadFile


Cj   (2007-06-29 04:46:00) [7]

вот правильней

var
f:cardinal;
a:array[1..1024]of byte;
r:cardinal;
s:string;
count:cardinal;
begin
f:=createfile (pchar('\\.\'+edit1.Text+':'),
            GENERIC_READ,FILE_SHARE_READ,
            nil,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
readfile(f,a,sizeof(a),r,nil);
count:=1;
for h:=1  to 1024*1024 do //считать один метр
begin
count:=count+1;
s:=s+inttohex(a[count],2);
end;

CloseHandle(f);
end;


Cj   (2007-06-29 04:45:00) [8]


> a:array[1..BootSize]of byte;


BootSize - это 1024


Cj   (2007-06-29 04:44:00) [9]


> begin...end ©   (28.06.07 20:27) [19]
> > Cj ©   (28.06.07 20:09) [17]См. [5].


вот:

var
f:cardinal;
a:array[1..BootSize]of byte;
r:cardinal;
s:string;
count:cardinal;
begin
f:=createfile (pchar('\\.\'+edit1.Text+':'),
             GENERIC_READ,FILE_SHARE_READ,
             nil,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
readfile(f,a,sizeof(a),r,nil);
count:=1;
for h:=1  to data.RowCount-1 do
 begin
 count:=count+1;
s:=s+inttohex(a[count],2);
 end;

CloseHandle(f);
end;

что неправильно?


Германн   (2007-06-29 02:46:00) [10]


> Джо ©   (29.06.07 02:19) [22]
>
> > [21] Германн ©   (29.06.07 02:00)
> > Есть конечно. У нас всё есть. ReadFile, например.
>
> А я могу дать BlockRead. По неподтвержденным слухам, она
> работает быстрее :-D
>

Ну так у тебя штаны особые :)


Джо   (2007-06-29 02:19:00) [11]

> [21] Германн ©   (29.06.07 02:00)
> Есть конечно. У нас всё есть. ReadFile, например.

А я могу дать BlockRead. По неподтвержденным слухам, она работает быстрее :-D


Германн   (2007-06-29 02:00:00) [12]


> просто_ник ©   (29.06.07 01:20) [20]
>
> а у вас есть функция чтобы считать cd-rom, очень нужно
>

Есть конечно. У нас всё есть. ReadFile, например.


просто_ник   (2007-06-29 01:20:00) [13]

а у вас есть функция чтобы считать cd-rom, очень нужно


begin...end   (2007-06-28 20:27:00) [14]

> Cj ©   (28.06.07 20:09) [17]

См. [5].


Правильный Вася   (2007-06-28 20:12:00) [15]

не надо читать по одному байту (так, как ты сейчас в час по чайной ложке выдавливаешь из своего тюбика инфу для нас)


Cj   (2007-06-28 20:09:00) [16]

а чё же тогда ReadFile читает медленнее, раз Blockread через неё выходит на файл


begin...end   (2007-06-28 19:59:00) [17]

> Cj ©   (28.06.07 17:58) [7]

Открою секрет: процедура BlockRead для чтения файла использует функцию ReadFile.


Cj   (2007-06-28 19:58:00) [18]

CreateFile('\\.\C:\', итд. вот и будет диск открыт


Anatoly Podgoretsky   (2007-06-28 19:48:00) [19]

> Cj  (28.06.2007 19:47:13)  [13]

Это чтение файла.


Cj   (2007-06-28 19:47:00) [20]

читает.: CreateFile, ReadFile


Страницы:   1 2

Наверх

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