Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
ВнизВырезание из файла Найти похожие ветки
← →
Pont (2007-07-15 22:31) [0]Здравствуйте! У меня такой вопрос: Я должен "вырезать" кусок файла (например из середины) и записать его в новый файл. каким образом лучше организовать "вырезание"? Может есть какие-либо спец. функции?
← →
{RASkov} © (2007-07-15 22:59) [1]> [0] Pont (15.07.07 22:31)
Принцип:
1) Открываешь файл из которого нужно вырезать кусок. (F)
2) Создаешь 2 новых файла. (F1,F2)
3) Читаешь из F и пишешь в F1 до места вырезания.
4) Читаешь из F и пишешь в F2 до конца «куска вырезания».
5) Читаешь из F и пишешь в F1 до конца файла F.
6) Закрываешь все файлы.
7) Удаляешь F.
8) ВСЕ.
← →
Anatoly Podgoretsky © (2007-07-15 23:11) [2]Второй файл для чего?
← →
{RASkov} © (2007-07-15 23:23) [3]> [2] Anatoly Podgoretsky © (15.07.07 23:11)
> Второй файл для чего?
Я так понял, должно в итоге два файла быть "оригинал без куска", и "кусок из оригинала"...
?
Собственно можно и не создавать второй файл...
Читать до начала куска,
записать кусок в новый файл,
сместить оставшиеся данные, на размер куска, к началу.
обрезать начальный файл.
Сорри за "запутанность"... этого поста)
← →
Anatoly Podgoretsky © (2007-07-15 23:27) [4]> {RASkov} (15.07.2007 23:23:03) [3]
Опять неправильно, не нужен первый файл, не надо ничего удалять и переименовывать, нужен только один файл для куска.
Алгоритм простой
открыть источник
переместиться на начала куска
прочитать кусок
записать кусок
закончить
← →
{RASkov} © (2007-07-15 23:28) [5]> [3] {RASkov} © (15.07.07 23:23)
> > [2] Anatoly Podgoretsky © (15.07.07 23:11)
> > Второй файл для чего?
>
> Я так понял, должно в итоге два файла быть "оригинал без
> куска", и "кусок из оригинала"...
> ?
А может это не мне вопрос был.... :) Да нет.... походу мне.
:о)
← →
{RASkov} © (2007-07-15 23:29) [6]> [4] Anatoly Podgoretsky © (15.07.07 23:27)
> открыть источник
> переместиться на начала куска
> прочитать кусок
> записать кусок
> закончить
Ну дык:
[0]> Я должен "вырезать" кусок файла
Ладно.... пусть автор уточнит...
← →
Anatoly Podgoretsky © (2007-07-15 23:31) [7]> {RASkov} (15.07.2007 23:29:06) [6]
Уточнять ничего не надо, вопрос поставлен одназначно. Кусок записать в новый файл.
← →
{RASkov} © (2007-07-15 23:35) [8]> [7] Anatoly Podgoretsky © (15.07.07 23:31)
Уговорил :) у автора "вырезание" в кавычках.... поэтому вырезать не будем. :-)
Автор См. [4].
← →
Pont (2007-07-16 00:12) [9]Вырезать то как раз надо!
А вообще меня наверное больше интересует алгоритм со смещением. Так как нежелательно 2 файла создавать.
← →
Германн © (2007-07-16 00:36) [10]
> Pont (16.07.07 00:12) [9]
>
> Вырезать то как раз надо!
> А вообще меня наверное больше интересует алгоритм со смещением.
> Так как нежелательно 2 файла создавать.
>
Тогда "вперед с песнями!" ИБП, надеюсь есть?
← →
Pont (2007-07-16 10:59) [11]Ну я вообще-то прошу вас помочь разобраться мне в этом алгоритме.
← →
StriderMan © (2007-07-16 12:31) [12]а "кусок" каким образом идентифицировать будешь?
← →
Elen © (2007-07-16 12:48) [13]Например делай так :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var a, b:TFileStream;
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
a:=TFileStream.Create("file1.txt",fmopenread);
b:=TFileStream.Create("file2.txt",fmcreate);
a.Position:=3; // с позиции 3
b.CopyFrom(a,5); // вырежеш 5 байт
a.Free;
b.Free;
end;
end.
← →
StriderMan © (2007-07-16 12:50) [14]
> var a, b:TFileStream;
а че глобальные переменные?
← →
Elen © (2007-07-16 13:03) [15]А че нет?
← →
StriderMan © (2007-07-16 13:06) [16]
> А че нет?
нехорошо это
← →
{RASkov} © (2007-07-16 13:26) [17]> b.CopyFrom(a,5); // вырежеш 5 байт
Так этож не вырежеться, а скопируется :)
> Pont
Попробуй так:procedure CutOutFromFilePieceAndKeepItInOtherFile(const FlOrig, FlPie: String; const StartPie, LengthPie: Integer);
var StreamOrig, StreamPie: TStream;
begin
StreamOrig:=TFileStream.Create(FlOrig, fmOpenReadWrite);
try
if StartPie+LengthPie>StreamOrig.Size then
raise Except.Create("Не верно указан кусок");
StreamPie:=TFileStream.Create(FlPie, fmCreate);
try
StreamOrig.Position:=StartPie;
StreamPie.CopyFrom(StreamOrig, LengthPie);
StreamOrig.Position:=StartPie;
StreamPie.Position:=0;
StreamOrig.CopyFrom(StreamPie, LengthPie);
StreamOrig.Size:=StreamOrig.Size-LengthPie;
finally
StreamPie.Free;
end;
finally
StreamOrig.Free;
end;
end;
Возможно гденить подправить нужно всякие -1 +1... В общем я не пробывал, но думаю мысль поймешь...
← →
Pont (2007-07-16 13:48) [18]В принципе все понятно. Тогда такой вопрос, который кому-то может показаться очень глупым: Ведь при копировании происходит вначале передача данных в оперативку? Значит если кусок большой мне надо его копировать по кускам? Или я не прав?
← →
StriderMan © (2007-07-16 13:51) [19]
> Значит если кусок большой мне надо его копировать по кускам?
> Или я не прав?
тут же потоками все сделано, можно насчет размеров не париться
← →
Dib@zol © (2007-07-16 13:59) [20]> Может есть какие-либо спец. функции?
Открывай файл с помощью CreateFile, прочитывай его содержимое в память (для примера в переменную P:Pointer), заводи ишшо один указатель (tgt:Pointer), задавай ему размер, равный размеру файла минус смещение, и прописывай в него <размер минус смещение> байт, начиная с байта longInt(P+смещение). Закрываешь первый файл открываешь второй и пишешь в него tgt^... Всё просто ;)))
← →
{RASkov} © (2007-07-16 14:11) [21]Да... внимательно посмотрел [17] - не верно!
Вот это вот дурь:
> StreamPie.Position:=0;
> StreamOrig.CopyFrom(StreamPie, LengthPie);
Ступил :)
Заменить на
1) Добавить еще одну переменную типа TSream;
2) Создать поток в памяти TMomoryStream
3) Скопировать в него из оригинального остаток после куска до конца файла
4) Сместить позицию временного на 0
5) Сместить позицию оригинального на СтартКусок и скопировать из временного(в памяти)
Ну и обрезка таже....
Сорри... за неточность :)
← →
Pont (2007-07-16 14:40) [22]{RASkov}
Я тоже увидел, что там ошибка. Главное, что общий принцип понял.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.047 c