Вниз
Скачать: CL | DM;

Файлы файлы файлы!!   Найти похожие ветки 

 
John Doe ©   (2004-03-13 20:39) [0]

Здрасте!! Мне необходимо прочитать файл и записать его побайтно в массив.Я использую Example(пример) из делфовского help"а.
Всегда выдается ошибка, а чтение происходит не всегда(или
не со всеми файлами), почему??
Как считать данные из "Buffer" (если они туда вообще заносятся)??
И почему если аттрибут "fmOpenRead" в функции "FileOpen" заменить на "faReadOnly", то файл вообще не читается!!

Помогите кто может!!

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;

Заранее благодарен!!


 
Defunct ©   (2004-03-13 20:48) [1]

procedure TForm1.Button1Click(Sender: TObject);
Var FileStream: TFileStream;
begin
 Try
   FileStream := TFileStream.Create("c:\100.jpg",fmOpenRead);
   FileStream.Position := 0;
   // В FileStream прочитанный файл, осталось только перекопировать в массив
 Finally
   FileStream.Free;
 End;
end;


 
Dimaxx ©   (2004-03-14 01:57) [2]

2 Defunct: После создания потока нет необходимости ставить указатель в ноль - метод create автоматически это делает.


 
default ©   (2004-03-14 02:10) [3]

Defunct ©   (13.03.04 20:48) [1]
или в TMemoryStream загружать(сразу и массив готов!)


 
Fay ©   (2004-03-14 02:52) [4]

Попробуй так

procedure  Jopa(fn : String);
var
 Buf : PChar;
 h : THandle;
 sz, n : Cardinal;
begin
 h := CreateFile(PChar(fn), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 if h = INVALID_HANDLE_VALUE then
   begin
     case GetLastError of
       .... blablalbla..
     end;
     Exit;
   end;
 sz := GetFileSize(h, nil);
 GetMem(Buf, sz);
 ReadFile(h, Buf^, sz, n, nil);
 for sz := 0 to n do
   begin
     StringGrid1.RowCount := StringGrid1.RowCount + 1;
     StringGrid1.Cells[1,i+1] := Buf[i];
     StringGrid1.Cells[2,i+1] := Char(Byte(Buf[i])+$30);
   end;
 FreeMem(Fuf);
 CloseHandle(h);
end;


 
John Doe   (2004-03-14 23:57) [5]

Всем спасибо за помощь!! Работает!! Особенно JOPA!!


 
Fay ©   (2004-03-15 00:19) [6]

Ваще-то Char(Byte(Buf[i])+$30) не совсем то, что хотел автор вопроса. 8) Я просто слишком долго не спал 8))
И  StringGrid1.RowCount надо бы вынести из цикла, типа:
StringGrid1.RowCount := StringGrid1.RowCount + n;
for ....


 
John Doe   (2004-03-15 21:15) [7]

2Fay
StringGrid мне не нужен!! Все что мне было нужно я подделал под себя и все нормально работает!! Благодарствую!! :)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.021 c
3-1078220239
Janbolat
2004-03-02 12:37
2004.04.04
Что такое loocup-поля


3-1078393464
Bless1
2004-03-04 12:44
2004.04.04
Куда исчезают параметры TADOStoredProc?


1-1079699024
iSurfer
2004-03-19 15:23
2004.04.04
Кнопки а-ля Windows


8-1069780816
Messir
2003-11-25 20:20
2004.04.04
Как засунуть в опр. Grid картинку и надпись поверх неё текст


4-1074871367
Phrodo
2004-01-23 18:22
2004.04.04
Информация об открытых хэндлах процесса




   Наверх