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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 14:46   #1
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию Удаление n-байт из позиции m в TFileStream

Всем привет, в общем вопрос такой.
В FileStream загружен файл 900 мб, я перемещаюсь в позицию 3000, как удалить/вырезать с 3001 до 5000 байт?
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 05.05.2012, 15:11   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Создать TMemoryStream, загрузить в него с 0 по 3000 байт и с 5001 до конца. Освободить TFileStream.Free и сохранить на его место TMemoryStream.SaveToFile
FaTaL вне форума Ответить с цитированием
Старый 06.05.2012, 08:02   #3
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Пишет ошибку Out of memory
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 06.05.2012, 08:11   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Значит что-то не так делаете. Давайте свой код.
FaTaL вне форума Ответить с цитированием
Старый 06.05.2012, 08:31   #5
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Код:
var ImgArhStream:TFileStream;
const
  ArhBlockCount=2048; //Размер одного блока (байт)
  MaxBlock=480768; //Максимум блоков

procedure RemoveFile(Index:integer);
  var
  StrangeIndex:integer;
  TempChr:array[1..ArhBlockCount] of AnsiChar;
  BlockIndex:integer;
  sMemory:TMemoryStream;
  Strange,Offset:DWORD;
begin
Strange:=Files[Index].FileStrange;
Offset:=Files[Index].FileOffset;
ImgArhStream.Position:=ArhBlockCount*Offset; //Смещение измеряется в блоках (1 блок=2048 байт)
sMemory:=TMemoryStream.Create;
ImgArhStream.position:=0; //Устанавливаем позицию на начало
    for BlockIndex := 0 to Offset-1 do от нуля до смещения (измеряется в блоках 2048 байт)
      begin
      ImgArhStream.Read(TempChr,ArhBlockCount); //Записываем в TempChr 2048 байт
      sMemory.Write(TempChr,ArhBlockCount); //Записываем в память 2048 байт
      end;
ImgArhStream.position:=(Offset+Strange+1)*ArhBlockCount; //Устанавливаем позицию на следующий блок после блока Смещение+Размер файла
  for BlockIndex := Offset+Strange+1 to MaxBlock do
    Begin
    ImgArhStream.Read(TempChr,ArhBlockCount);
    sMemory.Write(TempChr,ArhBlockCount);
    End;
ImgArhStream.Free;
sMemory.SaveToFile(Form1.Edit_PathToImg.Text);
sMemory.Free;
ImgArhStream:=TFileStream.Create(Form1.Edit_PathToImg.Text, fmOpenReadWrite);
end;
Инициализация и освобождение ImgArhStream в процедуре которая вызывает эту процедуру.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 06.05.2012 в 08:35.
Anton911 вне форума Ответить с цитированием
Старый 06.05.2012, 14:34   #6
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от Anton911 Посмотреть сообщение
Всем привет, в общем вопрос такой.
В FileStream загружен файл 900 мб, я перемещаюсь в позицию 3000, как удалить/вырезать с 3001 до 5000 байт?
Родного метода удаления нету, поэтому, придется скопировать в буфер, удалить файл, а потом записать занова.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 06.05.2012, 14:49   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Файл вообще-то достаточно большой. Лучше результат тоже в TFileStream, а потом исходный файл удалять, а вновь полученный переименовывать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.05.2012, 15:30   #8
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Я вот эксперементировал, до 850 мб он нормально записывал, а если больше 850 то out of memory. Чтож Придется через второй FileStream. Спасибо всем за ответы, всем +
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 08.05.2012, 10:57   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

А знаешь почему так? Скорей всего памяти оперативной у тебя 2 гб стоит и Win7, либо 1 гб и WinXP. Памяти не хватает на большие объемы, вот и получаем AV.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объект TFileStream Aleksey1989 Помощь студентам 8 01.06.2012 15:44
Вопрос про удаление символа с определенной позиции в строке lagg Общие вопросы C/C++ 1 15.11.2011 18:45
Найти байт максимальным количестов единиц и байт с максмальным количеством нулей и разность (ассемблер) Beren42 Помощь студентам 0 15.12.2010 20:32
проблемы с TFileStream andrey4623 Общие вопросы Delphi 9 01.11.2007 20:44
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22