Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Вырезание из файла   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
2-1184772072
velis
2007-07-18 19:21
2007.08.12
scrollbar и ползунок


2-1184248152
cava
2007-07-12 17:49
2007.08.12
линии


3-1177508561
DelphiLexx
2007-04-25 17:42
2007.08.12
DBGrid и опция dgEditing


11-1167056695
mixail_shar
2006-12-25 17:24
2007.08.12
Update до v2.49


15-1184527243
Константинов
2007-07-15 23:20
2007.08.12
tranceroute