Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
6-1166002405
Nikefest
2006-12-13 12:33
2007.08.12
Заполнение пароля на форме


15-1184546576
|
2007-07-16 04:42
2007.08.12
Свободные ресурсы


15-1184416042
de.
2007-07-14 16:27
2007.08.12
Ломится.


15-1184490692
Gero
2007-07-15 13:11
2007.08.12
Преобразовать матрешку в DVD-video


4-1172485867
DVM
2007-02-26 13:31
2007.08.12
Vista: получение информации о загрузке процессора.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский