Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Копирование папок с вложениями


Автор: kefir01 3.2.2008, 16:37
Хм, наверное я плохо задал вопрос, суда по нулевому числу ответов... smile 

Уточню... Есть в общем-то стандартный код копирования
Код

void __fastcall fCopy(AnsiString From, AnsiString To)
{
SHFILEOPSTRUCT sh;
sh.hwnd=Form1->Handle;
sh.wFunc = FO_COPY;
sh.pFrom = From.c_str();
sh.pTo = To.c_str();
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
}

Так вот как правильно через него организовать пофайловое копирование в следующем цикле
Код

__fastcall ScanDir(TMemo *memo, AnsiString s, TProgressBar *pbar, TEdit *edit, bool doCopy=false)
{
int c = 1;
    TSearchRec sr;
    if(!FindFirst(IncludeTrailingPathDelimiter(s) + "*.*", faAnyFile, sr)) {
      do {
...

        AnsiString pfrom = s + "\\" + sr.Name + "\0";
        AnsiString pto = edit->Text + "\\" + sr.Name;
        fCopy(pfrom,pto);

...
        }
      }
      while(!FindNext(sr));


Соответственно как сделать так, чтобы копировался отдельно каждый файл,дабы можно было отобразить ход копирования.
Заранее спасибо!

Автор: kefir01 4.2.2008, 08:58
Исправил вопрос ;)

Автор: PPS05 4.2.2008, 12:19
Если я правильно понял, то надо убрать флаг FOF_SILENT.

Автор: kefir01 4.2.2008, 12:50
Нет, к сожалению, встроенный виндовый ход меня не интересует. Нужно TProgressBar сделать. Я даже знаю как. Проблема в том, чтобы устроить пофайловое копирование с сохранением путей.

Полагаю косяк тут переменных pto и pfrom
Код

        AnsiString pfrom = s + "\\" + sr.Name + "\0";
        AnsiString pto = edit->Text + "\\" + sr.Name;
        fCopy(pfrom,pto);

Автор: PPS05 4.2.2008, 13:16
Тогда надо отказываться от SHFileOperation и копировать файлы ручками через буфер.

P.S. Строка 1: " + '\0' " - не надо.

Автор: kefir01 4.2.2008, 14:03
А можете сказать откуда копать? В смысле по функциям и проч.

Автор: PPS05 4.2.2008, 15:16
Если нужен только общий прогресс - сразу считаешь размер всех файлов (кажется, GetFileSize) потом копируешь каждый файл с помощью CopyFile (попутно обновляя прогресс, ибо известен размер всех файлов и уже скопированных). 

Если именно пофайловый - то CreateFile, ReadFile, WriteFile, т.е. в той же fCopy открываешь файл, читаешь по блокам (ну, допустим, по 64КБ), пишешь в другой, обновляешь прогресс.

Автор: kefir01 4.2.2008, 16:11
Спасибо. Мне достаточно на самом деле посчитать число файлов, выставить ProgressBar1->Max на это число и после копирования каждого файла сдвигать на 1 позицию бара.

Автор: PPS05 4.2.2008, 16:27
Не очень правильно, но если достаточно - то можно.  smile 

Автор: kefir01 4.2.2008, 16:31
Дзякуй!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)