Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Вставка данных в TFileStream   Найти похожие ветки 

 
Gosha11   (2006-10-13 09:25) [0]

Здравствуйте уважаемые.
Если возможность как-нибудь вставить данные в TFileStream не затирая имеющиеся? Я нашел только возможность записывать в него поверх тех данных, что в нем уже есть, с помощью Write, WriteBuffer. А вот вставка со сдвигом данных этого нет. Есть ли какие-нибудь пути решения такой проблемы? Файлы у меня огромные и их в память совсем не хочется грузить, но данные надо вставлять не в конец, а в разные части файлов.


 
Zeqfreed ©   (2006-10-13 09:30) [1]

Создаешь 2 файлстрима, копируешь до места вставки, копируешь то, что надо вставить, копируешь то, что ещё не скопировал. При желании повторить.


 
Slym ©   (2006-10-13 09:50) [2]

Можно, Структура файла:
PTEP:Int64 - PiecesTableEntryPoint

Data - Данные;
в конце файла -
PT:array of TPiece; - PiecesTable
TPiece=record
 EntryPoint:Int64;
 Length:integer;
end;

для вставки: находишь кусок в который надо вставить, разбиваешь его на 2 по месту вставки и между ними создаешь еще один кусок (TPiece), данные дописываешь в конец Data
Иногда нуна делать дефрагментацию файла иначе PiecesTable распухнет


 
Slym ©   (2006-10-13 09:52) [3]

PiecesTable полностью читаем в память
новые данные пишем по смещению PTEP и при закрытии файла сохранять в конец PiecesTable


 
Zeqfreed ©   (2006-10-13 09:55) [4]

> [2] Slym ©   (13.10.06 09:50)

А если надо вставить что-то в середину текстового файла? Или файла определенного формата? Зачем такие ужасные извращения.


 
Slym ©   (2006-10-13 09:58) [5]

чтение:

read(buf,offset,count)
1. суммируем длинны (Length) частей с первой до достижения offset
т.е. определяем в какой части находится искомая инфа.
2. вычисляем смещение в файле согласно проссумированным длиннам, offset и EntryPoint части
3. читаем, если достигли конца части берем следующую часть и продолжаем читать


 
Slym ©   (2006-10-13 09:59) [6]

Zeqfreed ©   (13.10.06 9:55) [4]
текстового файла

а ты про текстовый файл до этого ничего не говорил :)


 
Slym ©   (2006-10-13 10:01) [7]

Zeqfreed ©   (13.10.06 9:55) [4]
ужасные извращения

это примитивный FAT а не извращения, или даже NTFS (FAT фиксированного размера)


 
Zeqfreed ©   (2006-10-13 10:02) [8]

> [6] Slym ©   (13.10.06 09:59)

Я вообще ни про какие не говорил. Но уверен, что автору не нужен собственный извращенный способ хранения файлов.


 
Slym ©   (2006-10-13 10:04) [9]

Zeqfreed ©   (13.10.06 10:02) [8]
извращенный способ хранения файлов

формат файла со случайным доступом к месту дозаписи


 
Zeqfreed ©   (2006-10-13 10:08) [10]

> [9] Slym ©   (13.10.06 10:04)

Да это все понятно. Только смысла, мне кажется, в таком файле не много.


 
Slym ©   (2006-10-13 10:28) [11]

Zeqfreed ©   (13.10.06 10:08) [10]
Только смысла в таком файле не много

В файле не смысл, а данные :)
попробуй дописать в середину 1Gb файла 100Mb информации твоим [1] методом при условии что свободного места 500Mb :)


 
Slym ©   (2006-10-13 10:32) [12]

а уж потом можно добавить условие: при дозаписи N байт объем записываемых на диск данных не должен привышать N+M байт где M объем спец данных (формата данных) размером которого при больших N можно принебречь



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

Форум: "Основная";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.041 c
15-1162787729
Shopot
2006-11-06 07:35
2006.11.26
Borland Delphi & Borland C++ Builder.


2-1163083774
SerGoP
2006-11-09 17:49
2006.11.26
Нарастающий итог в столбце


2-1162916661
Oyster
2006-11-07 19:24
2006.11.26
Dialup из Delphi


3-1159197350
Silver...
2006-09-25 19:15
2006.11.26
SQL - ... Field1, Field2, Field2 NOT IN (...)


2-1162893063
ГореПрограммер
2006-11-07 12:51
2006.11.26
Ошибка в выполнении параллельного потока





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский