Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вырезание из файла


Страницы:   1 2

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)
> Второй файл для чего?

Я так понял, должно в итоге два файла быть "оригинал без куска", и "кусок из оригинала"...
?
Собственно можно и не создавать второй файл...
Читать до начала куска,
записать кусок в новый файл,
сместить оставшиеся данные, на размер куска, к началу.
обрезать начальный файл.
Сорри за "запутанность"... этого поста)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо