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