Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2007, 18:20   #1
OrdJONY
.NET-чик
Форумчанин
 
Аватар для OrdJONY
 
Регистрация: 24.03.2007
Сообщений: 569
По умолчанию Сдвиг файла

К примеру есть файл (может быть большого размера 1,5-2 гига) в 1000 позиции есть фрагмент размеров в 1000 байт. этот фрагмент нужно заменить другим фрагментом 1200 байт, т.е. весь файл надо сдвинуть на 200 байт. как такое сделать???
"Разработка под веб - как работа с пылесосом: нихрена не прикольно, но засасывает"
Мо маленький городок
OrdJONY вне форума Ответить с цитированием
Старый 14.12.2007, 18:37   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Прочитать в буфер содержимое файла после 2000-й позиции.
Создать новый файл, скопировав в него 0-1000 позиции исходного файла.
Удалить старый файл.
Добавить в "хвост" новому файлу фрагмент 1200 байт.
Добавить в "хвост" содержимое буфера.
Переименовать новый файл с "старый".
mihali4 вне форума Ответить с цитированием
Старый 14.12.2007, 19:11   #3
Artem
Пользователь
 
Регистрация: 08.07.2007
Сообщений: 76
По умолчанию

После таких действий файл не будет работать!!!
Только начал изучать Delphi...
Artem вне форума Ответить с цитированием
Старый 14.12.2007, 20:06   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 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.
JTG вне форума Ответить с цитированием
Старый 14.12.2007, 22:50   #5
OrdJONY
.NET-чик
Форумчанин
 
Аватар для OrdJONY
 
Регистрация: 24.03.2007
Сообщений: 569
По умолчанию

Еще мне говорили про метод дефрагментации какой-то. Кто нибудь что-то об этом знает???
"Разработка под веб - как работа с пылесосом: нихрена не прикольно, но засасывает"
Мо маленький городок
OrdJONY вне форума Ответить с цитированием
Старый 15.12.2007, 00:32   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от OrdJONY Посмотреть сообщение
Еще мне говорили про метод дефрагментации какой-то. Кто нибудь что-то об этом знает???
Открываем, наконец, глаза и смотрим соответствующую тему в разделе "Клуб программистов", подраздел "Обсуждение программ".
Похоже, вас мама навеки приучила, чтобы вас за ручку водили...
Самостоятельно и шагу ступить не можете...
mihali4 вне форума Ответить с цитированием
Старый 15.12.2007, 11:30   #7
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Цитата:
Открываем, наконец, глаза и смотрим соответствующую тему в разделе "Клуб программистов", подраздел "Обсуждение программ".
Похоже, вас мама навеки приучила, чтобы вас за ручку водили...
Самостоятельно и шагу ступить не можете...
Не то имелось ввиду.
Просто зная файловую систему FAT, NTFS можно теоретически вставить в середину файла хоть гиг, при этом копировать конец или начало вообще не надо. Файл в итоге получится фрагментированный, но зато запись будет мнгновенной.
zetrix вне форума Ответить с цитированием
Старый 15.12.2007, 11:45   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
можно теоретически вставить в середину файла хоть гиг, при этом копировать конец или начало вообще не надо. Файл в итоге получится фрагментированный, но зато запись будет мнгновенной.
Но кусок файла с 2000-й позиции все равно должен начинаться с нового сектора, т.е. перенос неизбежен. Правда, в этом случае можно перенести малый кусочек - с 2000-позиции до конца сектора, а начало следующего сектора в таблице файлов прописать как начало еще одного куска.
Вот только:
- даст ли винда работать с фатом?
- хватит ли знаний и умений не запороть фат?
Я бы не рискнул...
mihali4 вне форума Ответить с цитированием
Старый 15.12.2007, 12:24   #9
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

XP не даст, 98 - запросто.
Всё остальное зависит от кривизны рук.
zetrix вне форума Ответить с цитированием
Старый 15.12.2007, 12:35   #10
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от zetrix Посмотреть сообщение
Просто зная файловую систему FAT, NTFS можно теоретически вставить в середину файла хоть гиг, при этом копировать конец или начало вообще не надо. Файл в итоге получится фрагментированный, но зато запись будет мнгновенной.
Это можно только в том случае, если "старый" и "новый" куски кратны размеру кластера, т.е. такой вариант не слишком универсальный, по крайней мере, для 1000 или 1200 байт не пройдет.
Jeni вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сдвиг данных в 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