![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Два вопроса по работе с файлами [D7, WinXP]
LedWorm © (2004-12-24 20:50:00)Возникло два вопроса
1) Как дописать две строчки в файл (в самое начало, не в конец).
2) Как можно удалить эти две строчки.
заранее благодарен.
Просто Джо (2004-12-26 03:50:00) [1]А чтоб не грузили TreeView из моего файла... Ишь повадились! Мой файл, мой, зашифрованный. И пароль тоже мой. Не трожь.
Маленькая импровизация.
Leonid Troyanovsky (2004-12-25 22:58:00) [2]
> LedWorm (25.12.04 22:51) [14]
> А дописывание было нужно, чтобы записать в первую строку
> пароль, а потом этим паролем зашифровать все остальное (пароль
> тоже шифруется, но заранее известным алгоритмом).
Действительно, очень удобно.
Уж, во всяком случае, пароль не потеряется.
--
С уважением, LVT.
LedWorm (2004-12-25 22:51:00) [3]Спасибо всем, постараюсь разобраться.
А дописывание было нужно, чтобы записать в первую строку пароль, а потом этим паролем зашифровать все остальное (пароль тоже шифруется, но заранее известным алгоритмом).
begin...end (2004-12-25 21:48:00) [4]> [11] LedWorm (25.12.04 20:46)
Файл, пример которого Вы привели - это НЕ текстовый файл. Это ПРОСТО файл. В него нельзя встравить строку, или удалить её оттуда. Потому что никаких строк там НЕТ. Можно вставить туда какой-то блок информации, в том числе и массив символов, но это не будет строкой в обычном понимании (как для текстовых файлов). Если уж надо с этим файлом работать, - работайте с ним как с НЕтипизированным, т.е. как с ПРОСТО файлом - набором байтов, записанным на диск.
Вот пример, как можно вставить, например, 10 байт в начало такого файла:
var
MyFile: file; // Переменная файла
Size: Integer; // Размер исходного файла
pOldInfo: Pointer; // Указатель на буфер
InfoToAdd: array [1..10] of Byte; // Массив, который будем добавлять
begin
// Связываем файловую переменную с маршрутом доступа
AssignFile(MyFile, 'c:\TreeView.txt');
// Открываем файл для чтения
Reset(MyFile, 1);
// Определяем размер файла
Size := FileSize(MyFile);
// Выделяем память для хранения информации, которую мы хотим
// прочитать, т.е. той информации, которая уже есть в файле
GetMem(pOldInfo, Size);
// Читаем файл полностью
BlockRead(MyFile, pOldInfo^, Size);
// Закрываем файл
CloseFile(MyFile);
// Открываем тот же самый файл для записи
Rewrite(MyFile, 1);
// Файл очистился, он сейчас пуст
// Записываем туда 10 байт - массив InfoToAdd
BlockWrite(MyFile, InfoToAdd, Length(InfoToAdd));
// Теперь записываем ту информацию, которая была в исходном файле
BlockWrite(MyFile, pOldInfo^, Size);
// Закрываем файл
CloseFile(MyFile);
// Освобождаем память
FreeMem(pOldInfo)
end.
Теперь можно просмотреть этот файл, например, в FAR'е (но не в текстовом редакторе), и убедиться, что в начало его записались 10 байт - именно те 10 байт, которые и представлял из себя массив InfoToAdd.
Разумеется, можно было сделать то же самое и с помощью файловых потоков (TFileStream).
Но нужно ли это всё делать? Зачем Вам это "дописывание" нужно?
Leonid Troyanovsky (2004-12-25 21:21:00) [5]
> LedWorm (25.12.04 20:46) [11]
> две строчки нужно ставить в самое начало.
> Т.е. перед TPF...
"Где начало того конца, чем оканчивается начало?" [К.Прутков]
А вот и не надо вставлять в такой файл _строки_.
Да и, возможно, если внимательно разобраться,
может и вообще ничего не надо вставлять.
--
С уважением, LVT.
LedWorm (2004-12-25 20:46:00) [6]две строчки нужно ставить в самое начало.
Т.е. перед TPF...
Andrick (2004-12-25 17:44:00) [7]
> это вообще как? я думал это и есть признак конца файла,
> а как же быть если их несколько? (наверное я чего-то не
> понимаю)
Плиз просмотреть хекс любого архива, например, винрара - там этих кодов столько, сколько файлов в архиве
А, собственно, перед чем надо вставить строки? Где конец (или начало) того местечка, перед чем надо вставляться?
LedWorm (2004-12-25 17:40:00) [8]Этот файл создан при помощи следующей процедуры.
procedure TForm1.Button1Click(Sender: TObject);
var
F: TFileStream;
begin
F := TFileStream.Create('c:\TreeView.txt', fmCreate or fmShareCompat);
try
F.WriteComponent(TreeView1);
finally
F.Free;
end;
end;
LedWorm (2004-12-25 17:34:00) [9]TPF0\x11TTeThemeSTreeView TreeView1\x4Left\x2\x10\x3Top\x3╗\x5Width\x3╧\x6Height\x3!\x1\x5Color\x4ККН
HideSelection\x8\x6Images\x7\x12frmMain.ImageList1\x6Indent\x2\x13 PopupMenu\x7\x19frmMain.TeThemePopupMenu1\x8ReadOnly \x10RightClickSelect \xBShowButtons\x8 ShowLines\x8\x8TabOrder\x2\xF\x7Visible\x8
Items.Data
ф\x1'\x1ЪЪЪЪ\x1\xEDDI8vLXsE12dPB\x1F\x2\x2ЪЪЪЪЪЪЪЪ\x4\x6u3PIOB\x19ЪЪЪЪЪЪЪЪ\x19ЪЪЪЪЪЪЪЪ\x19ЪЪЪЪЪЪЪЪ\x19ЪЪЪЪЪЪЪЪ\xBThemeEngine\x7\x16frmMain.NgThemeEngine1
Это и есть собственно пример файла.
cadaber (2004-12-25 14:11:00) [10]TFileStream
_Lucky_ (2004-12-25 13:18:00) [11]Интересный факт
> читает только до первого EOF'а
это вообще как? я думал это и есть признак конца файла, а как же быть если их несколько? (наверное я чего-то не понимаю)
> Там все записано в одну строчку, причем очень много всяких
> знаков форматирования.
что в вашем понимании записано в одну строку? и какие это знаки форматирования? (перевод каретки, табуляция, ..., ?) можно было бы привести примеры, а лучше собственно файл, имея исходные данные гораздо легче решить поставленную задачу.
Anatoly Podgoretsky (2004-12-25 11:51:00) [12]Как можно удалить две первые строчке если файл состоит из одной строчки.
LedWorm (2004-12-25 10:30:00) [13]Дело в том, что файл уже создан (он сгенерирован какой-то программой).
Там все записано в одну строчку, причем очень много всяких знаков форматирования.
readln'ом ее прочитать не удается, читает только до первого EOF'а, а их там несколько.
Я конечно попробую со StringList покопаться, но может есть еще предложения?
VMcL (2004-12-24 21:13:00) [14]>> Alex_Bredin © (24.12.04 21:10) [2]
Смотря какой объём RAM.
Alex_Bredin (2004-12-24 21:10:00) [15]
> begin...end © (24.12.04 20:59) [1]
и для больших тоже (проверено до 100М)
begin...end (2004-12-24 20:59:00) [16]> LedWorm (24.12.04 20:50)
Для небольших текстовых файлов подойдёт TStringList.