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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2010, 16:55   #1
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию Копирование(удаление) произвольного фрагмента из файла > 2ГБ

Имею типизированный файл, в записи массив и группа данных к нему. Пока размер исходного файла не превышал 2Гб задача не вызывала проблем. Определял указатели начала и конца фрагмента и копировал в новый файл по необходимости или фрагмент или всё кроме фрагмента. Хотелось бы разобраться как подобную задачу решить для случая если фрагмент находится за пределами 2Гб. Можете подсказать что принципиально меняется?
A_Ton вне форума Ответить с цитированием
Старый 18.08.2010, 17:11   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ваша вера в наши телепатические способности помогает скорейшему решению вашей проблемы.

Если не понятно: ГДЕ КОД?

Навскидку: использовать TFileStream и позиционироваться через Int64.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2010, 17:31   #3
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Ваша вера в наши телепатические способности помогает скорейшему решению вашей проблемы.

Если не понятно: ГДЕ КОД?

Навскидку: использовать TFileStream и позиционироваться через Int64.
Я неверующий...
Зачем код? Вопрос ведь задан иначе!
Читаю нормально, правильно позиционируюсь в исходном файле ( Int64 ). Запись не получается!!! Не пойму как правильно писать выбранный из подобных файлов фрагмент!!!
Мне хотелось бы аргументированный типичный базовый пример вполне типичной задачи.
ЗЫ
Денег нет и не требуйте!

Последний раз редактировалось A_Ton; 18.08.2010 в 17:42.
A_Ton вне форума Ответить с цитированием
Старый 18.08.2010, 17:46   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Я тогда не понимаю вопроса. Потому что ничего там принципиально не меняется.

В чём проблема-то?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2010, 17:55   #5
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

>В чём проблема-то?
Запись не осуществляется. Удаётся создать только пустой файл, после некоторого времени работы процедуры вылетаю с этим пустым файлом.

Вот часть кода с удалением фрагмента, удивлён что нет общего решения в Делфях ( мне это кажется странным для типичной задачи ):

Hdc:=CreateFile(PChar(SaveFDlg.File Name),GENERIC_WRITE,0,nil,
CREATE_NEW,FILE_FLAG_WRITE_THROUGH, 0);
If Hdc=0 then Begin
MessageBox(Handle,'Не могу открыть файл для копии!','Ошибка',MB_ICONERROR);
Exit; end;
for i:= 0 to NFrames-1 do begin
if (i>=FrStPos) and (i<=FrEndPos) then continue;
RdKadr(i);
WriteFile(Hdc,RecFile,SizeOf(RecFil e),bytesWritten, nil);
end;
CloseHandle(Hdc);

RdKadr(i) - читает прекрасно RecFile и пусть она Вас не смущает, многократно проверено в том числе и визуально.
Извините, не могу нормально отобразить код на форуме.

Последний раз редактировалось A_Ton; 18.08.2010 в 18:10.
A_Ton вне форума Ответить с цитированием
Старый 18.08.2010, 18:15   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если понял задачу, то проблема в том, что у вас в корне не верный подход. Зачем удалять куски из файла? Разумеется чтобы удалить запись (раз типизированный файл). А почему не пойти другим путем. К примеру, запись будет содержать флаг 0 - удален, 1 - занят. В таком случае, вам стоит всего лишь найти удаляемую запись и переписать всего 1 бит прекрасно ведь, лучше чем 2 гига перегонять по диску. Ну разумеется Вы скажете, а как же размер, таким образом файл будет расти не по дням, а по часам. Так дело в том, что у вас типизированный файл, а значит один и тот же тип / запись одного и того же размера, а следовательно если надо добавить новую запись, ищите запись в файле у которой наш флаг сброшен в 0 (удалена) и пишите на ее место новую запись. Опять такие, запишите всего лишь размер записи, а не 2 гига
BOBAH13 вне форума Ответить с цитированием
Старый 18.08.2010, 18:21   #7
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Зачем удалять куски из файла?
Вы поняли правильно. NFrames - количество записей в фале, где-то до 4000.
Границы циклов определяю верно уже неск. лет, можно не сомневаться
Исходный файл является ДОКУМЕНТОМ и редактированию НЕ ПОДЛЕЖИТ!
Кроме того с файлом копией нужного участка девушкам работать легче и быстрее. Хранить и передавать когда их десятки в месяц тоже проще.

Последний раз редактировалось A_Ton; 18.08.2010 в 18:30.
A_Ton вне форума Ответить с цитированием
Старый 18.08.2010, 18:52   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от A_Ton Посмотреть сообщение
вылетаю
Подробно поясните, что это значит.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2010, 19:02   #9
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

>Подробно поясните, что это значит.
Создался пустой файл, программа ещё некоторое время проработала над копированием ( вижу индикацию ) , а затем завершается с ошибкой. Файл остаётся пустым. В том слуае если файл меньше 2ГБ всё проходит нормально.
A_Ton вне форума Ответить с цитированием
Старый 18.08.2010, 19:05   #10
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Если все раньше работало нормально, то не может эта ошибка быть из-за файловой системы? FAT16 (он не поддерживает файлы больше 2 ГБ) вместо FAT32?
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование/Удаление подкаталогов Xanex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 16.05.2010 20:40
Удаление и копирование формы krikaved Общие вопросы Delphi 1 25.03.2010 12:56
Удаление фрагмента текста Шурик Общие вопросы Delphi 0 31.05.2009 16:11
Как востановить фотографии с флешки в 2ГБ miniSD Easyman Компьютерное железо 2 30.07.2008 13:45
Чтение фрагмента файла в динамический массив. ZeroCool. Общие вопросы Delphi 2 02.11.2007 08:14