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

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

Открыть файл с CD-ROMa (read-only) [D6, WinXP]


Миха ©   (2004-08-07 11:17:00) 

Не могу открыть файлы с CD-ROMa с помощью RESET'a.
Даёт IOError=5.


VMcL   (2004-08-08 17:36:00) [1]

Люди, читайте Help - кладезь знаний.

procedure Reset(var F [: File; RecSize: Word]);
...
Warning:The default value of FileMode is 2 (Read/Write access). If this is not changed to a read-only file mode before calling Reset, attempts to open read-only files will fail.


Миха   (2004-08-08 17:07:00) [2]

Спасибо! Добавил FileMode:=0 и всё заработало.
Это мне и надо было. Если переходить на SysUtils, надо много перелопачивать.


Mim1   (2004-08-08 16:34:00) [3]


> [2] Yanis ©   (07.08.04 15:27)
> Reset открывает для записи. На CD-ROM'е такого не проделаешь
> ;)

Кажется для записи открывает rewrite;.


wnew   (2004-08-08 14:29:00) [4]

Какая разница, что на винте, что на CD?
Открывается без проблем:


procedure TForm1.Button1Click(Sender: TObject);
var
 F: file;
 Buff: array[1..102400] of Byte;
 ReadCount: Cardinal;
 Gesamt: Extended;
begin
 if OpenDialog1.Execute then
 begin
   AssignFile(F,OpenDialog1.FileName);
   FileMode := 0;
   Reset(F,SizeOf(Byte)*2);
   Gesamt := 0;
   try
     repeat
       BlockRead(F,Buff,SizeOf(Buff) div 2,ReadCount);
       Gesamt := Gesamt + ReadCount;
     until (ReadCount = 0) or (ReadCount < SizeOf(Buff) div 2);
     Edit1.Text := Format('Is read %3.4f MB', [Gesamt * 2 / 1048576]);
   finally
    CloseFile(F);
   end;
 end;
end;


На моём компе эта процедурка считывает файл с CD размером 792MB около 13 мин.

Считывай в буфер и потом анализируй из этого буфера. Если всё-таки хочешь по два байта - установи размер буфера в два байта.

Вообще, не понятно, как можно что-то анализировать исходя из одной единицы информации. Наверное, всё же, блоком считывать для анализа предпочтительнее.


Миха   (2004-08-08 11:07:00) [5]

У меня данные измерений (после ввода с АЦП) хранятся в виде двух файлов: один (106 байт) - файл параметров, хранит разные типы данных, объединены в record. Спасибо wnew, его я прочитал.
Второй файл размером до 700 мб - файл двухбайтных данных (smallint). Когда он на винте, я последовательно читаю данные, не буферируя их, прямо из файла и обрабатываю, например усредняю их.
По-видимому, с CD так не получится, хотя странно, что файл read-only нельзя открыть для чтения модулем system. Придётся работать с буфером в случае с CD, и оставить возможность работы напрямую с данными в случае винта.
Сейчас пробую открыть file of smallint, пока что в буфере одни нули, считанных байтов=-1. Что-то не так делаю. Вот код:

var DataBuf : array of smallint;
   DataHandle,DataLength,DataBytesRead: integer;
begin
   DataHandle:=FileOpen(DataName,fmOpenRead);
   DataLength:=FileSeek(DataHandle,0,2);
   FileSeek(DataHandle,0,0);
   DataBuf:=AllocMem(DataLength+1);
   DataBytesRead:=FileRead(DataHandle,DataBuf,DataLength);
   FileClose(DataHandle);
end;


Fay   (2004-08-07 22:51:00) [6]

2 Миха   (07.08.04 19:46) [10]
Напиши, что ты собираешься делать с этим файлом - скорее получишь "правильный" ответ.


wnew   (2004-08-07 19:59:00) [7]

А чем тебе эта строка не нравится?

Buffer := PChar(AllocMem(iFileLength + 1));


Миха   (2004-08-07 19:46:00) [8]

Ребята! Где я возьму буфер в 700 мб ?


wnew   (2004-08-07 19:25:00) [9]


> Миха   (07.08.04 19:11) [7]
> Куда вставлять FileMode:=2 ?


Пример из справки Delphi:)


procedure TForm1.Button1Click(Sender: TObject);

var
 iFileHandle: Integer;
 iFileLength: Integer;
 iBytesRead: Integer;
 Buffer: PChar;
 i: Integer
begin
 if OpenDialog1.Execute then
 begin
   try
     iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
     iFileLength := FileSeek(iFileHandle,0,2);
     FileSeek(iFileHandle,0,0);
     Buffer := PChar(AllocMem(iFileLength + 1));
     iBytesRead = FileRead(iFileHandle, Buffer, iFileLength);
     FileClose(iFileHandle);

     for i := 0 to iBytesRead-1 do
     begin
       StringGrid1.RowCount := StringGrid1.RowCount + 1;
       StringGrid1.Cells[1,i+1] := Buffer[i];
       StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
     end;
   finally
     FreeMem(Buffer);
   end;
 end;
end;


Vetek_2   (2004-08-07 19:12:00) [10]

reset - устарел


Миха   (2004-08-07 19:11:00) [11]

Мой неправильный код:

AssignFile(File,FileName);
Reset(File);

Выдаёт IOResult=5.
---
Файлы у меня по 700 мб, поэтому я устал копировать их на винт.
С винта - то всё работает нормально.
---
Куда вставлять FileMode:=2 ?


Fay   (2004-08-07 15:43:00) [12]

CreateFile чем не угодил?


Кириешки   (2004-08-07 15:41:00) [13]

А скопировать файл и открыть с винта нельзя?


Yanis   (2004-08-07 15:30:00) [14]

Вот и ногвый способ перезагрузки =)


DrPass   (2004-08-07 15:29:00) [15]


> Не могу открыть файлы с CD-ROMa с помощью RESET'a.

Странно, а у меня RESET вообще вызывает перезагрузку

P.S. FileMode:=2, что же еще


Yanis   (2004-08-07 15:27:00) [16]

Reset открывает для записи. На CD-ROM'е такого не проделаешь ;)


Anatoly Podgoretsky   (2004-08-07 13:08:00) [17]

Ну и где твой неправильный код?


Наверх

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