![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вырезание из файла
Pont © (2007-07-15 22:31:00)Здравствуйте! У меня такой вопрос: Я должен "вырезать" кусок файла (например из середины) и записать его в новый файл. каким образом лучше организовать "вырезание"? Может есть какие-либо спец. функции?
Pont (2007-07-16 14:40:00) [1]{RASkov}
Я тоже увидел, что там ошибка. Главное, что общий принцип понял.
{RASkov} (2007-07-16 14:11:00) [2]Да... внимательно посмотрел [17] - не верно!
Вот это вот дурь:
> StreamPie.Position:=0;
> StreamOrig.CopyFrom(StreamPie, LengthPie);
Ступил :)
Заменить на
1) Добавить еще одну переменную типа TSream;
2) Создать поток в памяти TMomoryStream
3) Скопировать в него из оригинального остаток после куска до конца файла
4) Сместить позицию временного на 0
5) Сместить позицию оригинального на СтартКусок и скопировать из временного(в памяти)
Ну и обрезка таже....
Сорри... за неточность :)
Dib@zol (2007-07-16 13:59:00) [3]> Может есть какие-либо спец. функции?
Открывай файл с помощью CreateFile, прочитывай его содержимое в память (для примера в переменную P:Pointer), заводи ишшо один указатель (tgt:Pointer), задавай ему размер, равный размеру файла минус смещение, и прописывай в него <размер минус смещение> байт, начиная с байта longInt(P+смещение). Закрываешь первый файл открываешь второй и пишешь в него tgt^... Всё просто ;)))
StriderMan (2007-07-16 13:51:00) [4]
> Значит если кусок большой мне надо его копировать по кускам?
> Или я не прав?
тут же потоками все сделано, можно насчет размеров не париться
Pont (2007-07-16 13:48:00) [5]В принципе все понятно. Тогда такой вопрос, который кому-то может показаться очень глупым: Ведь при копировании происходит вначале передача данных в оперативку? Значит если кусок большой мне надо его копировать по кускам? Или я не прав?
{RASkov} (2007-07-16 13:26:00) [6]> 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... В общем я не пробывал, но думаю мысль поймешь...
StriderMan (2007-07-16 13:06:00) [7]
> А че нет?
нехорошо это
Elen (2007-07-16 13:03:00) [8]А че нет?
StriderMan (2007-07-16 12:50:00) [9]
> var a, b:TFileStream;
а че глобальные переменные?
Elen (2007-07-16 12:48:00) [10]Например делай так :
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:31:00) [11]а "кусок" каким образом идентифицировать будешь?
Pont (2007-07-16 10:59:00) [12]Ну я вообще-то прошу вас помочь разобраться мне в этом алгоритме.
Германн (2007-07-16 00:36:00) [13]
> Pont (16.07.07 00:12) [9]
>
> Вырезать то как раз надо!
> А вообще меня наверное больше интересует алгоритм со смещением.
> Так как нежелательно 2 файла создавать.
>
Тогда "вперед с песнями!" ИБП, надеюсь есть?
Pont (2007-07-16 00:12:00) [14]Вырезать то как раз надо!
А вообще меня наверное больше интересует алгоритм со смещением. Так как нежелательно 2 файла создавать.
{RASkov} (2007-07-15 23:35:00) [15]> [7] Anatoly Podgoretsky © (15.07.07 23:31)
Уговорил :) у автора "вырезание" в кавычках.... поэтому вырезать не будем. :-)
Автор См. [4].
Anatoly Podgoretsky (2007-07-15 23:31:00) [16]> {RASkov} (15.07.2007 23:29:06) [6]
Уточнять ничего не надо, вопрос поставлен одназначно. Кусок записать в новый файл.
{RASkov} (2007-07-15 23:29:00) [17]> [4] Anatoly Podgoretsky © (15.07.07 23:27)
> открыть источник
> переместиться на начала куска
> прочитать кусок
> записать кусок
> закончить
Ну дык:
[0]> Я должен "вырезать" кусок файла
Ладно.... пусть автор уточнит...
{RASkov} (2007-07-15 23:28:00) [18]> [3] {RASkov} © (15.07.07 23:23)
> > [2] Anatoly Podgoretsky © (15.07.07 23:11)
> > Второй файл для чего?
>
> Я так понял, должно в итоге два файла быть "оригинал без
> куска", и "кусок из оригинала"...
> ?
А может это не мне вопрос был.... :) Да нет.... походу мне.
:о)
Anatoly Podgoretsky (2007-07-15 23:27:00) [19]> {RASkov} (15.07.2007 23:23:03) [3]
Опять неправильно, не нужен первый файл, не надо ничего удалять и переименовывать, нужен только один файл для куска.
Алгоритм простой
открыть источник
переместиться на начала куска
прочитать кусок
записать кусок
закончить
{RASkov} (2007-07-15 23:23:00) [20]> [2] Anatoly Podgoretsky © (15.07.07 23:11)
> Второй файл для чего?
Я так понял, должно в итоге два файла быть "оригинал без куска", и "кусок из оригинала"...
?
Собственно можно и не создавать второй файл...
Читать до начала куска,
записать кусок в новый файл,
сместить оставшиеся данные, на размер куска, к началу.
обрезать начальный файл.
Сорри за "запутанность"... этого поста)