|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.12.2007, 18:20 | #1 |
.NET-чик
Форумчанин
Регистрация: 24.03.2007
Сообщений: 569
|
Сдвиг файла
К примеру есть файл (может быть большого размера 1,5-2 гига) в 1000 позиции есть фрагмент размеров в 1000 байт. этот фрагмент нужно заменить другим фрагментом 1200 байт, т.е. весь файл надо сдвинуть на 200 байт. как такое сделать???
"Разработка под веб - как работа с пылесосом: нихрена не прикольно, но засасывает"
Мо маленький городок |
14.12.2007, 18:37 | #2 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Прочитать в буфер содержимое файла после 2000-й позиции.
Создать новый файл, скопировав в него 0-1000 позиции исходного файла. Удалить старый файл. Добавить в "хвост" новому файлу фрагмент 1200 байт. Добавить в "хвост" содержимое буфера. Переименовать новый файл с "старый". |
14.12.2007, 19:11 | #3 |
Пользователь
Регистрация: 08.07.2007
Сообщений: 76
|
После таких действий файл не будет работать!!!
Только начал изучать Delphi...
|
14.12.2007, 20:06 | #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. |
15.12.2007, 00:32 | #6 | |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Цитата:
Похоже, вас мама навеки приучила, чтобы вас за ручку водили... Самостоятельно и шагу ступить не можете... |
|
15.12.2007, 11:30 | #7 | |
Delphi/C++/C#
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,972
|
Цитата:
Просто зная файловую систему FAT, NTFS можно теоретически вставить в середину файла хоть гиг, при этом копировать конец или начало вообще не надо. Файл в итоге получится фрагментированный, но зато запись будет мнгновенной. |
|
15.12.2007, 11:45 | #8 | |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Цитата:
Вот только: - даст ли винда работать с фатом? - хватит ли знаний и умений не запороть фат? Я бы не рискнул... |
|
15.12.2007, 12:24 | #9 |
Delphi/C++/C#
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,972
|
XP не даст, 98 - запросто.
Всё остальное зависит от кривизны рук. |
15.12.2007, 12:35 | #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 |