![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TFileStream.Create или еще чего? [D6, Win2k]
Pavelkq © (2004-12-27 09:18:00)Пытаюсь открывать вордовский файл. Чтение, как обычный текстовый файл не прокатывает. Пробую следующее:
procedure TForm1.Button1Click(Sender: TObject);
var name: string;
S: TFileStream;
Reader: TReader;
begin
Memo1.Lines.Clear;
if Form1.OpenDialog1.Execute then
name := OpenDialog1.FileName;
if name='' then exit;
S:=TFileStream.Create(name,fmOpenRead);
Reader := TReader.Create (S, 1024);
Reader.ReadListBegin;
while not Reader.EndOfList do
Memo1.Lines.Add (Reader.ReadString);
Reader.ReadListEnd;
Reader.Destroy;
S.Destroy;
end;
Все компилируется, но при выполнении (когда уже выбран файл) вылетает ошибка с сообщениемInvalid property value.
Предполагаю, что тут объектTReaderплохо подходит. А что делать? Мне нужно просто считать в строковую переменную весь набор символов для дальнейшего анализа (можно за несколько циклов, т.е. кусками).
Pavelkq (2004-12-27 12:14:00) [1]Ура, получилось и то и другое! Просто если просить вывести переменную S, как string, она выводит пустоту, т.к. не успев начаться заканчивается. А если в цикле выводить по одному символу, то там все на месте!
Кстати, с байтом тоже все проходит на ура!
Спасибо!
Рамиль (2004-12-27 10:45:00) [2]s[i] считает, потеряется до #0 если копировать присвоением в другую строку.
Или как
Плохиш © (27.12.04 10:41) [7]
Плохиш (2004-12-27 10:41:00) [3]array of byte
Pavelkq (2004-12-27 10:30:00) [4]Сработало без ошибок, но после выполнения переменная S оказалась пустой. Очевидно, то, что попало из файла в память содержит #0, то интерпретируется, как конец. А вот до метода Read там были пустые данные. А без PCharа нельзя? Или как обойти этот #0?
Рамиль (2004-12-27 10:19:00) [5]Pavelkq (27.12.04 10:01) [4]
Вот бы кусок живого кода!
Пожалуйста:)
var
F: TFileStream;
s: string;
F := TFileStream.Create('C:\1.doc', fmOpenRead);
SetLength(s, F.Size);
F.Read(s[1], F.Size);
Но только ответственность за интерпретацию полностью на тебе.
Pavelkq (2004-12-27 10:01:00) [6]Попробовал из справки пример:
procedure TForm1.Button1Click(Sender: TObject);
var
H: Integer;
iFileLength: Integer;
iBytesRead: Integer;
Buffer: PChar;
i: Integer;
begin
if OpenDialog1.Execute then
begin
try
H := FileOpen(OpenDialog1.FileName, fmOpenRead);
iFileLength := FileSeek(H,0,2);
FileSeek(H,0,0);
Buffer := PChar(AllocMem(iFileLength + 1));
iBytesRead := FileRead(H, Buffer, iFileLength);
FileClose(H);
for i := 0 to iBytesRead-1 do
begin
Memo1.Lines.Add(String(Buffer[i]));
Memo1.Lines.Add(IntToStr(Integer(Buffer[i])));
end;
finally
FreeMem(Buffer);
end;
end;
end;
На строке передачи в мемо все вылетает.
TFileStream.Readпробовал, но тоже не пойму до конца, как его юзать. Вот бы кусок живого кода!
Рамиль (2004-12-27 09:58:00) [7]Pavelkq (27.12.04 9:35) [2]
А зачем Word для каждого файла открывать?
А зачем тебе TReader понадобился? Он здесь совсем не к месту.
Используй TFileStream.Read
Pavelkq (2004-12-27 09:35:00) [8]Знаешь сколько времени ворд открывается? А если файлов 1500? А мне нужно вынуть всего лишь свойства.
В общем, мне нужен любой метод чтения набора символов (или их кодов) можно даже по одному.
Рамиль (2004-12-27 09:27:00) [9]Если тебе нужен текст, то читай через Word.