Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение размера в спроецированных файлах  (Прочитано 15228 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kuzmich
Гость
« : 01-10-2003 03:48 » 

в общем задача такая: есть файл большого размера я его проецирую на адресное пространство, потом необходимо в середину файла добавить данные, как это красиво реализовать что-то плохо догадываюсь, у Рихтера тоже ничего ненашел. На данный момент сделано так:
Код:
HANDLE hFile = CreateFile)...:;
HANDLE hMap = CreateFileMapping)...:; // проецируем весь файл
PBYTE = MapViewOfFile)...:; // представление на весь файл

Можно конечно сделать проекцию большего размера чем файл и при добавлении данных воспользоваться CopyMemory, но тогда операционка будет перезаписывать весь конец файла.
Подскажите как это реализовать по-умному.
Записан
Asan
Гость
« Ответ #1 : 01-10-2003 06:11 » 

Ну так ведь PBYTE это ж указатель на область памяти. Вот и работай с ним как с указателем.
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #2 : 01-10-2003 08:33 » 

Kuzmich, а файл у тебя текстовый?
Записан

Megabyte be with you!
Kuzmich
Гость
« Ответ #3 : 01-10-2003 08:43 » 

Цитата: Asan
Ну так ведь PBYTE это ж указатель на область памяти. Вот и работай с ним как с указателем.

Ну допустим содержимое по этому указателю: PBYTE = [01][02][03] памяти выделено 3 байта, надо сделать PBYTE = [01][04][02][03]. (незабываем что это проецируемый файл)
Цитата: Lex
Kuzmich, а файл у тебя текстовый?

Файл нетекстовый.
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #4 : 01-10-2003 09:11 » 

Если файл не текстовый, то может быть стоит его организовать как связанный список, можно двунаправленный, т.е. данные разбить на какие-нить логические блоки, которые ты будешь изменять, вставлять и т.п.
Записан

Megabyte be with you!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 01-10-2003 09:37 » 

Kuzmich, я всё-таки не совсем въехал. Это я так понимаю продолжение проблемы со скроллингом?
Тогда такие вопросы:

1. Данные должны быть именно добавленны(удалены), а не измененны? Размер файла изменяется или нет?

2. Надо ли потом сохранять этот файл?

3. Если 2-"да" - В виртуальной памяти ты это хочешь сделать для промежуточных изменений?

Lex, я думаю с блоками не прокатит, где гарантия того, что изменяемые данные будут находиться в одном блоке? Хотя стоит подумать...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Kuzmich
Гость
« Ответ #6 : 01-10-2003 10:22 » 

Цитата

Kuzmich, я всё-таки не совсем въехал. Это я так понимаю продолжение проблемы со скроллингом?

Проблемму со скролингом я уже решил (всем спасибо), но это из-тогоже проекта Улыбаюсь
Цитата

1. Данные должны быть именно добавленны(удалены), а не измененны? Размер файла изменяется или нет?

Данные должны быть именно добавленны(удалены). Replace only я уже сделал. Про изменение размера написано в заголовке темы (не обижайся)
Цитата

2. Надо ли потом сохранять этот файл?

Надо
Цитата

3. Если 2-"да" - В виртуальной памяти ты это хочешь сделать для промежуточных изменений?

Мне неважно где, главное чтоб было красиво Улыбаюсь
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #7 : 01-10-2003 10:30 » 

с блоками это наиболее приемлемое решение, которое мне приходит на ум. Пример базы данных. блок это одна запись.
Я бы сделал нечто подобное. Как разбивать на блоки сильно зависит от данных. Если тебе надо заменить блок ты его дописываешь в конец и меняешь ссылки на него в других блоках. И переодически нужно будет делать операцию компакт файл, т.е. переписывать файл стявя все блоки подряд и выкидывая ненужные куски.
Записан

Megabyte be with you!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 01-10-2003 10:31 » 

Упс, про заголовок-то я и забыл  :oops: Сорри
Про "в середину файла добавить данные" стоит в топике - проосто хотел схалтурить Ага , а ну как просто содержимое байтов поменять.

Слушай, а чем тебе функции манипуляции с файлом не нравятся? типа SetFilePointer
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Kuzmich
Гость
« Ответ #9 : 01-10-2003 10:41 » 

Цитата: Джон
Слушай, а чем тебе функции манипуляции с файлом не нравятся? типа SetFilePointer

Файлы большие очень, думаю будет медленно, счас почитаю про SetFilePointer.
Просто я думал есть какие-то стандартные решения.
Переставление блоков будет тоже медленно, темболее если нужно будет добавить всего 1 байт.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 01-10-2003 10:53 » 

Виртуальная память - это тоже по большому хард, или у тебя 4 GB RAM Ага
Так что не знаю, насчёт скорости IMHO, много не выиграешь.
А с SetFilePointer я работал, правда не с гигабайтными файлами...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #11 : 01-10-2003 10:58 » 

Джон, А как SetFilePointer поможет вместо 3 байт в старом файле записать 4 байта после редактирования?
Записан

Megabyte be with you!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 01-10-2003 11:29 » 

Имелось ввиду - зачем надо мапить файлы? а не работать с файлами напрямую - функции для поиска, чтения-записи есть. Опять же не "зачем мапят" файлы, а в данном случае. При размерах несколько гигабайт. В любом случае будет происходить физическая переброска данных на диске.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #13 : 01-10-2003 11:32 » 

Джон, На счет мапить могу предположить, что предполагалось, что это может помочь в решении проблемы.
Записан

Megabyte be with you!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 01-10-2003 12:14 » 

Я так понял, что вы не хотите данные туда-сюда перекидывать.

Может кольцевой буфер я такой делал типа FIFO, с начальными-конечными изменениями он справлялся, но здесь надо и с серединой играться?

И кстати я не поставил крест на твоей идее с блоками. Проблема с определением блоков. Где начало - где конец? В идеале было бы каждый байт как элемент списка представить, тогда потребление ресурсов возрастёт как минмум в: про байт - 2 по 4 байта указатели на соседей,  раз.

Может подождать LongHorn  Ага

Хотя гигабайты переписывать всё-равно придётся. По-любому.

А если сформулировать задачу по-другому, то получается - есть массив
a[0]a[1]a[2]a[3]...a[n] - вопрос: как убрать a[2]?

Или я уже  не в тему?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #15 : 01-10-2003 12:21 » 

размер блока зависит от данных, и от них же и может изменяться.  Это кроме кузмича никто не скажет. Улыбаюсь

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

Megabyte be with you!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 01-10-2003 12:36 » 

Цитата: Lex

А вариант с блоками как раз не требует переписывания гигабайтов, только одного блока плюс два указателя.


согласен - тогда и маппинг пригодится.

Но всё-таки если это непрерывный  байтовый поток, то сложно будет определить.

Кузьмииич, ты где? хоть бы сказал, что за данные?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #17 : 01-10-2003 12:42 » 

если это неприрывный байтовый поток то можно выделиь фиксированный размер блока типа 16К и оперировать ими. Но опять же конкретный размер блока нужно выбирать изходя из конкретных условий задачи.
Записан

Megabyte be with you!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 01-10-2003 14:01 » 

Фиксированный? не знаю. А если редактируемые данные больше 16К?

А если так:

1. Сначала ищем (или ставим) в файле редактируемое место - по-любому надо.

2. Пользователь определяет размер блока для изменения, напр. одна страница текста, или одна песня, или что там у кузмича...

3. А потом раскладываем данные в список с известным размером блока.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Kuzmich
Гость
« Ответ #19 : 02-10-2003 07:33 » 

За идеи спасибо, тут еще с нашими программерами поговорил, потом все напишу, счас времени нет сорри
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #20 : 02-10-2003 09:01 » 

Джон, вся фишка в том, что файл изначально должен быть связанным списком. Это относится к концепции системы в целом.
Записан

Megabyte be with you!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines