![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
.NET-чик
Форумчанин
Регистрация: 24.03.2007
Сообщений: 569
|
![]()
К примеру есть файл (может быть большого размера 1,5-2 гига) в 1000 позиции есть фрагмент размеров в 1000 байт. этот фрагмент нужно заменить другим фрагментом 1200 байт, т.е. весь файл надо сдвинуть на 200 байт. как такое сделать???
"Разработка под веб - как работа с пылесосом: нихрена не прикольно, но засасывает"
Мо маленький городок ![]() |
![]() |
![]() |
![]() |
#2 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
![]()
Прочитать в буфер содержимое файла после 2000-й позиции.
Создать новый файл, скопировав в него 0-1000 позиции исходного файла. Удалить старый файл. Добавить в "хвост" новому файлу фрагмент 1200 байт. Добавить в "хвост" содержимое буфера. Переименовать новый файл с "старый". |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 08.07.2007
Сообщений: 76
|
![]()
После таких действий файл не будет работать!!!
Только начал изучать Delphi...
|
![]() |
![]() |
![]() |
#4 |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
![]()
Псевдокодом:
CreateFile(исходный_файл/GENERIC_READ+GENERIC_WRITE) SetFilePointer на <размер_файла>+200 байт SetEndOfFile - файл увеличился на 200 байт мусора SetFilePointer на 2001-й байт (байты 1000-2000 нам не нужны) CreateFile(временный_файл,GENERIC_READ+GENERI C_WRITE) Цикл ReadFile(исходный_файл, в буффер размером Х Мб ) WriteFile(временный_файл, буффер) - а то в буффер гиг загнать нереально конец_цикла //сохранили хвост файла после 2000 позиции на диск SetFilePointer(исходный_файл,1001) WriteFile(исходный_файл, 1200, данные) //записали новые 1200 байт вместо 1000 SetFilePointer(временный_файл,начало) Цикл ReadFile(временный_файл, в буффер размером Х Мб ) WriteFile(исходный_файл, буффер) конец_цикла //записали хвост обратно * наверно можно оптимизировать
пыщь
Последний раз редактировалось JTG; 14.12.2007 в 20:10. |
![]() |
![]() |
![]() |
#6 | |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
![]() Цитата:
Похоже, вас мама навеки приучила, чтобы вас за ручку водили... Самостоятельно и шагу ступить не можете... ![]() |
|
![]() |
![]() |
![]() |
#7 | |
Delphi/C++/C#
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,972
|
![]() Цитата:
Просто зная файловую систему FAT, NTFS можно теоретически вставить в середину файла хоть гиг, при этом копировать конец или начало вообще не надо. Файл в итоге получится фрагментированный, но зато запись будет мнгновенной. |
|
![]() |
![]() |
![]() |
#8 | |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
![]() Цитата:
Вот только: - даст ли винда работать с фатом? - хватит ли знаний и умений не запороть фат? Я бы не рискнул... |
|
![]() |
![]() |
![]() |
#9 |
Delphi/C++/C#
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,972
|
![]()
XP не даст, 98 - запросто.
Всё остальное зависит от кривизны рук. |
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
![]()
Это можно только в том случае, если "старый" и "новый" куски кратны размеру кластера, т.е. такой вариант не слишком универсальный, по крайней мере, для 1000 или 1200 байт не пройдет.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
сдвиг данных в dbgrid'e на 1 вверх | kate158 | БД в Delphi | 5 | 22.08.2008 22:20 |
циклический сдвиг массива | goacher | Общие вопросы C/C++ | 4 | 28.05.2008 20:11 |
циклический сдвиг массива | goacher | Паскаль, Turbo Pascal, PascalABC.NET | 4 | 27.05.2008 22:26 |
Циклический сдвиг столбцов в массиве С++ Помогите! | Ладушка | Общие вопросы C/C++ | 10 | 01.05.2008 23:17 |