Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2010, 13:25   #41
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Зато теперь понятно почему
Цитата:
на предыдущем форуме дельфистов за эту фигню Вы поинтересуетесь хватит ли у меня денег?
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 19.08.2010, 13:31   #42
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

>Зато теперь понятно почему
Здесь тоже похоже хотят если не разбогатеть то хотя бы узнать как скопировать фрагмент большого файла ;-)))))))))))))))))))))
A_Ton вне форума Ответить с цитированием
Старый 19.08.2010, 13:34   #43
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Цитата:
Сообщение от A_Ton Посмотреть сообщение
>Зато теперь понятно почему
Здесь тоже похоже хотят если не разбогатеть то хотя бы узнать как скопировать фрагмент большого файла ;-)))))))))))))))))))))
[OFFTOP]О да, один Вы у нас гений до такого додумались, а собравшиеся тут, только и делают, что коллекционируют чужие реализации...[/OFFTOP]

Модераторы, закрывайте топик!
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 19.08.2010, 13:37   #44
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

>Модераторы, закрывайте топик!

Правильно! Поболтать удобнее на других сайтах ;-)))))))
A_Ton вне форума Ответить с цитированием
Старый 19.08.2010, 15:16   #45
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от A_Ton Посмотреть сообщение
Здесь тоже похоже хотят если не разбогатеть то хотя бы узнать как скопировать фрагмент большого файла ;-)))))))))))))))))))))
То что вы привели работает, так как это копипаст из модуля SysUtils
Цитата:
Сообщение от Delphi / Kylix Cross-Platform Runtime Library
System Utilities Unit
Copyright (c) 1995-2002 Borland Softwrare Corporation
Код:
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64;
{$IFDEF MSWINDOWS}
begin
  Result := Offset;
  Int64Rec(Result).Lo := SetFilePointer(THandle(Handle), Int64Rec(Result).Lo,
    @Int64Rec(Result).Hi, Origin);
end;
{$ENDIF}
{$IFDEF LINUX}
var
  Temp: Integer;
begin
  Temp := Offset;  // allow for range-checking
  Result := FileSeek(Handle, Temp, Origin);
end;
{$ENDIF}
Вот пример копирования блоков. d:\Медиа\Chernyi_Jastreb.avi - это мой файл размером 1024 блока по 2692854 байт каждый.
Код:
  TRecInFile = record
    x: array[0..2692854-1] of char;
  end;

var
  Hdc, Hd, bytesWritten:cardinal;
  i, NFrames, FrStPos, FrEndPos:integer;
  RecFile: TRecInFile;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  Hdc:=CreateFile('d:\file.avi',GENERIC_WRITE,0,nil,
    CREATE_NEW,FILE_FLAG_WRITE_THROUGH, 0);
  Hd:=CreateFile('d:\Медиа\Chernyi_Jastreb.avi',GENERIC_READ,0,nil,
    OPEN_EXISTING,0, 0);
  NFrames:=1024;//кол-во блоков
  FrStPos:=10;
  FrEndPos:=1022;
  for i:= 0 to NFrames-1 do begin
  //логичнее делать цикл repeat until bytesWritten=0; а i сделать счётчиком
    if (i>=FrStPos) and (i<=FrEndPos) then continue;
    //начало RdKadr(i);
      FileSeek(Hd,Int64(i) * Int64(SizeOf(TRecInFile)),0);
      bytesWritten:=FileRead(Hd,RecFile,SizeOf(TRecInFile));
    //конец RdKadr(i);
    WriteFile(Hdc,RecFile,SizeOf(RecFile),bytesWritten, nil);
  end;
  CloseHandle(Hdc);
  CloseHandle(Hd);
  ShowMessage('Закончено');
end;
Кстати класс TFileStream вызывает те же самые API, но будет поудобнее в обращении
eoln вне форума Ответить с цитированием
Старый 19.08.2010, 22:32   #46
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

>d:\Медиа\Chernyi_Jastreb.avi - это мой файл размером 1024 блока по 2692854 байт каждый.
СПАСИБО ! Сейчас буду внимательно смотреть.
С УВАЖЕНИЕМ, A_Ton .

PS
Если не затруднит могли бы Вы привести пример с использованием TFileStream в ближайшие дни. Работа с файлами вызывает затруднения не только у меня, полагаю Вам будут благодарны многие. Ещё раз СПАСИБО!

Последний раз редактировалось A_Ton; 19.08.2010 в 22:36.
A_Ton вне форума Ответить с цитированием
Старый 20.08.2010, 00:25   #47
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

TFileStream очень схож, примеры на форуме имеются. В частности ваш случай будет примерно таким
Код:
var
  file1, file2: TFileStream;
  bytesWritten: integer;
  RecFile: array[0..16*1024-1] of char; //определяем размер блока
  i: int64;
  FrStPos, FrEndPos: integer;
begin
  file1 := TFileStream.Create('d:\Медиа\Chernyi_Jastreb.avi', fmOpenRead or fmShareDenyWrite);
  file2 := TFileStream.Create('d:\new file.avi', fmCreate or fmOpenWrite);
  i := -1;
  FrStPos:=10;     
  FrEndPos:=1000;
  repeat
    inc(i);//счётчик блоков. первый блок имеет номер ноль.
    {//можно добавить процесс наглядности при каждом сотым или тысячном проходе взависимости от размера блока
    if i mod 1000 = 0 then begin
      form1.Caption := inttostr(100 * file2.Size div file1.Size) + ' %';
      application.ProcessMessages
    end;}
    if (i >= FrStPos) and (i <= FrEndPos) then continue;
    //при чтении указатель сам перемещается, так что вручную это можно не делать
    //надо перемещаться только в случае прыжка через блоки
    if i = FrEndPos + 1 then //эта строка необязательна, она лишь оптимизирует данный случай
      file1.Seek(i * SizeOf(RecFile), soBeginning);//или file1.Position := i * SizeOf(RecFile)
    bytesWritten := file1.Read(RecFile,SizeOf(RecFile));
    file2.Write(RecFile, bytesWritten)
  until bytesWritten = 0;
  file1.Destroy;
  file2.Destroy;
  form1.Caption := 'Закончено';
end;
Этот код копирует всё кроме блоков из интервала [FrStPos, FrEndPos]
eoln вне форума Ответить с цитированием
Старый 20.08.2010, 01:26   #48
A_Ton
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 22
По умолчанию

Ваш код реально работает !!! Вы действительно мне помогли.

> bytesWritten:=FileRead(Hd,RecFile,S izeOf(TRecInFile));

СПАСИБО за тактичную подсказку :-) !!!
К сожалению по нескольким языкам у меня только самообразование, а на дельфях это вообще первый хотя и довольно сложный и объёмный проект ;-))))
СПАСИБО !!!!

>TFileStream очень схож,
Очень признателен! Удачи Вам !!!

> {//можно добавить процесс наглядности
В нашем с Вами случае удобно использовать TrackBar , просто, хорошо принимается пользователем и ничего лишнего ! :-) .
Границы фрагмента я тоже указываю с его помощью.

Вопрос :
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64;
Как Вы боретесь под виндой с rangecheck error ? Откуда она там ?

Последний раз редактировалось A_Ton; 20.08.2010 в 11:29.
A_Ton вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование/Удаление подкаталогов Xanex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 16.05.2010 20:40
Удаление и копирование формы krikaved Общие вопросы Delphi 1 25.03.2010 12:56
Удаление фрагмента текста Шурик Общие вопросы Delphi 0 31.05.2009 16:11
Как востановить фотографии с флешки в 2ГБ miniSD Easyman Компьютерное железо 2 30.07.2008 13:45
Чтение фрагмента файла в динамический массив. ZeroCool. Общие вопросы Delphi 2 02.11.2007 08:14