Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Открыть файл с 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.051 c
1-1091707980
Menel
2004-08-05 16:13
2004.08.22
Вопрос по окружностям и знакам...


14-1091829838
Ertong
2004-08-07 02:03
2004.08.22
Мобильная революция


3-1090749396
a3a3ello
2004-07-25 13:56
2004.08.22
InterBase -> Firebird


14-1091684804
REA
2004-08-05 09:46
2004.08.22
Нашествие


1-1092118596
Игорь_
2004-08-10 10:16
2004.08.22
Влияет ли файловая система на компиляцию программы ?