Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование файлов... ...используя "msctls_progress32" 
:(
    Опции темы
WIN32API
  Дата 17.5.2005, 19:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, не отсылай меня в ФАГ, т.к. ответа на мой вопрос там нет. Меня интересует копирование файлов (не одного файла, а нескольких), используя при этом msctls_progress32. И msctls_progress32 при этом должен отображать результат копирования всех файлов сразу, как это делает любая программа установки, а не каждого в отдельности.
  Вверх
WolfON
Дата 17.5.2005, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



делаешь в дельфе copyfile для каждого файла по очереди и как очередь убывает - добавляешь в прогресс бар.
PM MAIL ICQ   Вверх
RA
Дата 18.5.2005, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Код

//Создаём прогресс 
 hwndProgress := CreateWindowEx(0, 'msctls_progress32', nil, WS_CHILD or
        WS_VISIBLE or PBS_SMOOTH, 8, 136, 329, 16, hWnd, 0, hInstance, nil);

       SendMessage(hwndProgress, PBM_SETRANGE, 0, Integer(100 shl 16));
//RANGE
       SendMessage(hwndProgress, PBM_SETSTEP, 1, 0);
//STEP


SendMessage(hwndProgress, PBM_SETPOS, 0, 0);
//Позиция прогресс бара


ЗЫ:
только не надо писать что ответ найден и давать ссылку на библиотеку ленина.


PM   Вверх
WIN32API
  Дата 18.5.2005, 09:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











С кодом прогресса понятно, а как на практике реализовать :
Цитата
делаешь в дельфе copyfile для каждого файла по очереди и как очередь убывает - добавляешь в прогресс бар.


smile
  Вверх
Quadr0
Дата 19.5.2005, 00:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:40
  Вверх
WIN32API
  Дата 19.5.2005, 20:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, написал я процедурку копирования файлов вместе с подкаталогами и отображения процесса в прогрессбаре, но столкнулся с проблемой подсчета количества файлов (включая подкаталоги). Может, знаете способ? Поделитесь. И еще - можно как-нибудь остановить копирование? Если да то как? Примеры приветствуются!

Код

procedure sCopyDirectory(Origen, Desti : string);
var
 filecount: Integer;
 Files : integer;
 FOrigen, FDesti : string;
 Search : TSearchRec;
begin
 filecount := ОПРЕДЕЛЯЕМ КОЛИЧЕСТВО ФАЙЛОВ И В ПОДКАТАТАЛОГАХ ТАКЖЕ;
 SendMessage(GetDlgItem(hWin, 2), PBM_SETRANGE32, 0, filecount); //Минимальная и максимальная позиция пргресса
 SendMessage(GetDlgItem(hWin, 2), PBM_SETSTEP, 1, 0); //Шаг прогресса
 //Ищем файлы
 Files := FindFirst(Origen + '\*.*', faAnyFile, Search);
  while Files = 0 do begin
   if Search.Attr <> faDirectory then begin
    FOrigen := Origen + '\' + Search.Name;
    FDesti := Desti + '\' + Search.Name;
    //Копируем
    CopyFile(PChar(FOrigen),PChar(FDesti),false);
    //Передвигаем позицию прогресса
    SendMessage(GetDlgItem(hWin, 2), PBM_SETPOS, Progress_GetPos(GetDlgItem(hWin, 2)) + 1, 0);
    //Показываем какой файл копируется в данный момент
    SendMessage(GetDlgItem(hWin, 3), WM_SETTEXT, 0, Integer(PChar('Copyng: ' + Search.name)));
   end else begin
    if (Search.Name <> '.') and (Search.Name <> '..') then begin
     //Создаем каталоги
     if CreateDir(Desti + '\' + Search.Name) then
      sCopyDirectory(Origen+'\'+Search.Name,Desti+'\'+Search.Name);
    end;
   end;
  Files := FindNext(Search);
 end;
  FindClose(Search);
end;

  Вверх
_hunter
Дата 19.5.2005, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



можно. для этого перед началом копирования нужно выполнить обход все каталогов и посчитать сколько файлов в них содержится.

для копирования файлов с возможностью остановки используй CopyFileEx()


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
WIN32API
Дата 20.5.2005, 11:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











CopyFileEx() не работает в 98 винде. Меня это не устраивает.
  Вверх
_hunter
Дата 20.5.2005, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



тогда пиши свою функцию


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
WIN32API
Дата 20.5.2005, 13:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну так а я чем занимаюсь?
  Вверх
_hunter
Дата 20.5.2005, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а я откуда знаю? ты задал вопрос -- я ответил. если ты имел в виду не то что спросил -- спроси то, что имел в виду...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
WIN32API
Дата 21.5.2005, 11:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Заканчиваем флеймить!
Итак, повторяю вопрос. Вот моя процедурка:

Код

procedure sCopyDirectory(Origen, Desti : string);
var
 filecount: Integer;
 Files : integer;
 FOrigen, FDesti : string;
 Search : TSearchRec;
begin
 filecount := ОПРЕДЕЛЯЕМ КОЛИЧЕСТВО ФАЙЛОВ И В ПОДКАТАТАЛОГАХ ТАКЖЕ;
 SendMessage(GetDlgItem(hWin, 2), PBM_SETRANGE32, 0, filecount); //Минимальная и максимальная позиция пргресса
 SendMessage(GetDlgItem(hWin, 2), PBM_SETSTEP, 1, 0); //Шаг прогресса
 //Ищем файлы
 Files := FindFirst(Origen + '\*.*', faAnyFile, Search);
  while Files = 0 do begin
   if Search.Attr <> faDirectory then begin
    FOrigen := Origen + '\' + Search.Name;
    FDesti := Desti + '\' + Search.Name;
    //Копируем
    CopyFile(PChar(FOrigen),PChar(FDesti),false);
    //Передвигаем позицию прогресса
    SendMessage(GetDlgItem(hWin, 2), PBM_SETPOS, Progress_GetPos(GetDlgItem(hWin, 2)) + 1, 0);
    //Показываем какой файл копируется в данный момент
    SendMessage(GetDlgItem(hWin, 3), WM_SETTEXT, 0, Integer(PChar('Copyng: ' + Search.name)));
   end else begin
    if (Search.Name <> '.') and (Search.Name <> '..') then begin
     //Создаем каталоги
     if CreateDir(Desti + '\' + Search.Name) then
      sCopyDirectory(Origen+'\'+Search.Name,Desti+'\'+Search.Name);
    end;
   end;
  Files := FindNext(Search);
 end;
  FindClose(Search);
end;


Народ, написал я процедурку копирования файлов вместе с подкаталогами и отображения процесса в прогрессбаре, но столкнулся с проблемой подсчета количества файлов (включая подкаталоги). Может, знаете способ? Поделитесь. И еще - можно как-нибудь остановить копирование? Если да то как?

Примеры приветствуются! и даже очень!!! smile

  Вверх
Quadr0
Дата 21.5.2005, 17:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:41
  Вверх
WIN32API
Дата 22.5.2005, 18:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну, добро - с подсчетом я разберусь... Сейчас серьезно интересует вопрос об остановке копирования. Как это сделать? Вот здесь пожалуйста с примерами, хотя бы косвенными.
  Вверх
Quadr0
Дата 22.5.2005, 23:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:45
  Вверх
WIN32API
Дата 23.5.2005, 11:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я хочу останавливать (прерывать) копирование. Как это делают все инсталлеры...
  Вверх
_hunter
Дата 23.5.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



объясняю еще раз. медленно.
остановить CopyFile() нельзя. если хочеш ее остановить пиши свою CopyFile()
то, что ты привел -- не функция копирования ( и говорил я не о ней )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
WIN32API
Дата 23.5.2005, 13:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А зачем останавливать CopyFile? Реальнее остановить FindFirst. Вот тока как это сделать? Может, ввести тупую проверку внутри кода типа

Код

var
fCopy: Boolean;
...
if fCopy = false then exit;


Если вы предложите что-то более корректное - буду признателен.
  Вверх
_hunter
Дата 23.5.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



потому что при копировании 700-гигового файла долго в монитор глядеть придется...

а других способов и нет.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
WIN32API
Дата 23.5.2005, 13:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А ты видел файлы такого размера? (Сорри за флейм)
  Вверх
Quadr0
Дата 23.5.2005, 14:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 19.5.2011, 16:44
  Вверх
_hunter
Дата 23.5.2005, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



такого -- нет smile ( это я для понятности )
но файлы на пару гигов тоже не секунды копируются...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
RA
Дата 24.5.2005, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Надеюсь общая идея ясна, а
переделать не составит друда.

Код

var con:boolean;
..
type
  TCallBack = procedure(Position, Size: Longint);
................
procedure myFileCopyCallBack(Position, Size: Longint);
begin
  Form1.ProgressBar1.Max := Size;
  Form1.ProgressBar1.Position := Position;
end;

procedure myFileCopy(const InFileName, OutFileName: string;
  CallBack: TCallBack);
const
  BufSize = 3 * 4 * 4096;
type
  PBuffer = ^TBuffer;
  TBuffer = array[1..BufSize] of Byte;
var
 // LAbel  GTFup;
  Size: DWORD;
  Buffer: PBuffer;
  infile, outfile: file;
  SizeDone, SizeFile: LongInt;
begin
  if (InFileName <> OutFileName) then
  begin
    buffer := nil;
    Assign(infile, InFileName);
    Reset(infile, 1);
    try
      SizeFile := FileSize(infile);
      Assign(outfile, OutFileName);
      Rewrite(outfile, 1);
      try
        SizeDone := 0;
        New(Buffer);
        repeat
          Application.ProcessMessages;
          BlockRead(infile, Buffer^, BufSize, Size);
          Inc(SizeDone, Size);
          //-----------
          CallBack(SizeDone, SizeFile);
          if not con then break;
          Application.ProcessMessages;
          BlockWrite(outfile, Buffer^, Size)

        until Size < BufSize;
        FileSetDate(TFileRec(outfile).Handle,
        FileGetDate(TFileRec(infile).Handle));
      finally
        if Buffer <> nil then
          Dispose(Buffer);
        CloseFile(outfile)
      end;
    finally
      CloseFile(infile);
    end;
  end
  else
    raise EInOutError.Create('File cannot be copied')
end;

............
//Initiate
con:=true;
myFileCopy('c:\downloads\cs16full_v13(2).exe', 'd:\1.exe', @myFileCopyCallBack);

//Stop
con:=false




PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.