Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизОткрыть файл с CD-ROMa (read-only) Найти похожие ветки
← →
Миха (2004-08-07 11:17) [0]Не могу открыть файлы с CD-ROMa с помощью RESET"a.
Даёт IOError=5.
← →
Anatoly Podgoretsky © (2004-08-07 13:08) [1]Ну и где твой неправильный код?
← →
Yanis © (2004-08-07 15:27) [2]Reset открывает для записи. На CD-ROM"е такого не проделаешь ;)
← →
DrPass © (2004-08-07 15:29) [3]
> Не могу открыть файлы с CD-ROMa с помощью RESET"a.
Странно, а у меня RESET вообще вызывает перезагрузку
P.S. FileMode:=2, что же еще
← →
Yanis © (2004-08-07 15:30) [4]Вот и ногвый способ перезагрузки =)
← →
Кириешки © (2004-08-07 15:41) [5]А скопировать файл и открыть с винта нельзя?
← →
Fay © (2004-08-07 15:43) [6]CreateFile чем не угодил?
← →
Миха (2004-08-07 19:11) [7]Мой неправильный код:
AssignFile(File,FileName);
Reset(File);
Выдаёт IOResult=5.
---
Файлы у меня по 700 мб, поэтому я устал копировать их на винт.
С винта - то всё работает нормально.
---
Куда вставлять FileMode:=2 ?
← →
Vetek_2 (2004-08-07 19:12) [8]reset - устарел
← →
wnew © (2004-08-07 19:25) [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;
← →
Миха (2004-08-07 19:46) [10]Ребята! Где я возьму буфер в 700 мб ?
← →
wnew © (2004-08-07 19:59) [11]А чем тебе эта строка не нравится?
Buffer := PChar(AllocMem(iFileLength + 1));
← →
Fay © (2004-08-07 22:51) [12]2 Миха (07.08.04 19:46) [10]
Напиши, что ты собираешься делать с этим файлом - скорее получишь "правильный" ответ.
← →
Миха (2004-08-08 11:07) [13]У меня данные измерений (после ввода с АЦП) хранятся в виде двух файлов: один (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;
← →
wnew © (2004-08-08 14:29) [14]Какая разница, что на винте, что на 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 мин.
Считывай в буфер и потом анализируй из этого буфера. Если всё-таки хочешь по два байта - установи размер буфера в два байта.
Вообще, не понятно, как можно что-то анализировать исходя из одной единицы информации. Наверное, всё же, блоком считывать для анализа предпочтительнее.
← →
Mim1 © (2004-08-08 16:34) [15]
> [2] Yanis © (07.08.04 15:27)
> Reset открывает для записи. На CD-ROM"е такого не проделаешь
> ;)
Кажется для записи открываетrewrite;
.
← →
Миха (2004-08-08 17:07) [16]Спасибо! Добавил FileMode:=0 и всё заработало.
Это мне и надо было. Если переходить на SysUtils, надо много перелопачивать.
← →
VMcL © (2004-08-08 17:36) [17]Люди, читайте 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.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.049 c