Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
14-1091513636
olookin
2004-08-03 10:13
2004.08.22
Непроизвольная неправильная запись слов


3-1091022448
r00t
2004-07-28 17:47
2004.08.22
Как отобразить формулы и т.д. в бд?


14-1091714217
default
2004-08-05 17:56
2004.08.22
Удалённая работа


9-1079999810
Новичек
2004-03-23 02:56
2004.08.22
Как написать 3d-игру?


14-1091585711
Думкин
2004-08-04 06:15
2004.08.22
С днем рождения! 4 августа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский