На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Копирование, удаление файлов и папок , Не Windows методами...
    Мне нужно какой-либо способ копирование, перемещения и удаления файлов и папок, чтобы при этом я мог знать статус копирования (сколько процентов всего откопировалось, и сколько процентов откопировалось данного файла если я копирую директорию).

    Ниже я привожу код копирования файла методом TFileStream. Как мне с помощью него откопировать целую папку(я пробовал вызывать процедуру рекурсивно, но прога вылетала после копирования 2000 файлов)? :wall:

    Если можно обойтись без этого способа, то подскажите как это сделать!

    ExpandedWrap disabled
      Пример копирования файлов (TFileStream) в потоке (TThread).
      Компилятор: Delphi
       
       
       
      unit copythread;
       
      interface
       
      uses
        Classes, SysUtils;
       
      Const
        KB1 = 1024;
        MB1 = 1024*KB1;
        GB1 = 1024*MB1;
       
      type
        TCopyFile = class(TThread)
        public
          Percent    : Integer;
          Done,ToDo  : Integer;
          Start      : TDateTime;
          constructor Create(Src, Dest: String);
        private
          { Private declarations }
          IName,OName : String;
        protected
          procedure Execute; override;
        end;
       
      implementation
       
      { TCopyFile }
       
      constructor TCopyFile.Create(Src, Dest : String);
      begin
        IName := Src;
        OName := Dest;
        Percent := 0;
        Start := Now;
        FreeOnTerminate := True;
        inherited Create(True);
      end;
       
      procedure TCopyFile.Execute;
      var
        fi,fo       : TFileStream;
        dod,did     : Integer;
        cnt,max     : Integer;
       
      begin
       
        Start := Now;
        try
          { Открываем существующий путь }
          fo := TFileStream.Create(OName, fmOpenReadWrite);
          fo.Position:=fo.size;
        except
          { иначе создаём путь }
          fo := TFileStream.Create(OName, fmCreate);
        end;
        try
          { открываем копируемый файл }
          fi := TFileStream.Create(IName, fmOpenRead);
          try
            { синхронизируем }
            cnt:= fo.Position;
            fi.Position := cnt;
            max := fi.Size;
            ToDo := Max-cnt;
            Done := 0;
       
            { начинаем копирование }
            Repeat
              dod := MB1; // Block size
              if cnt+dod>max then dod := max-cnt;
              if dod>0 then did := fo.CopyFrom(fi, dod);
              cnt:=cnt+did;
              Percent := Round(Cnt/Max*100);
       
              Done := Done+did;
              ToDo := Max;
            until (dod=0) or (Terminated);
       
          finally
            fi.free;
          end;
        finally
          fo.free;
        end;
      end;
       
      end.
       
       
       
      Как использовать:
       
      begin
      ...
        TCopyFile.Create('d:\sourcfile.dat','d:\destination.dat');
      ...
      end;
      Heretic2, в FAQ есть алгоритм перебора всех файлов во всех директориях рекурсивно.
      Используй его и для каждого выполняй процедуру копирования файла.
        Цитата Heretic2,9.01.05, 23:27 @
        Мне нужно какой-либо способ копирование, перемещения и удаления файлов и папок, чтобы при этом я мог знать статус копирования (сколько процентов всего откопировалось, и сколько процентов откопировалось данного файла если я копирую директорию).

        Тебе для чего эта информация нужна?? Только для отображения? Если да, то все это умеет ShFileOperation(в тоом числе и копировать папки целиком).
        Кроме того есть функция CopyFileEx, которая через callback функцию извещает о процессе копирования..
          Цитата
          Heretic2, в FAQ есть алгоритм перебора всех файлов во всех директориях рекурсивно.
          Используй его и для каждого выполняй процедуру копирования файла.


          Я так уже пробовал и у меня прога вылетает, если в папке 2000 или более файлов.



          Цитата
          Тебе для чего эта информация нужна?? Только для отображения? Если да, то все это умеет ShFileOperation(в тоом числе и копировать папки целиком).
          Кроме того есть функция CopyFileEx, которая через callback функцию извещает о процессе копирования..


          Как это всё работает, ф то я сам разбирался и у меня нифига не получилось
            ExpandedWrap disabled
              var
                FromDir, ToDir: string;
                soo: TSHFileOpStruct;
              begin
                if SelectDirectory('From:', '', FromDir) and
                   SelectDirectory('To:', '', ToDir) then
                begin
                  ZeroMemory(@soo, SizeOf(soo));
                  soo.pFrom := PChar(FromDir + #0);
                  soo.pTo := PChar(ToDir + #0);
                  soo.wFunc := FO_COPY;
                  ShFileOperation(soo);
                end;
              end;

            а с CopyFileEx уж сам постарайся ;-)
              А как мне узнать сколко процентов выполнено?
                Цитата Heretic2 @ 10.01.05, 14:27
                А как мне узнать сколко процентов выполнено?

                Цитата jack128 @ 10.01.05, 02:36
                а с CopyFileEx уж сам постарайся ;-)
                  Нужно уметь читать справки по Windows API. Там ясно написано:
                  Цитата
                  lpProgressRoutine

                  Specifies the address of a callback function of type LPPROGRESS_ROUTINE that is called each time another portion of the file has been copied. This parameter can be NULL. For more information on the progress callback function, see CopyProgressRoutine.
                    Вот нашёл описание этих функций(правда для C++). Как мне соединить всё это :wall: . Напишите пример.


                    ExpandedWrap disabled
                      BOOL CopyFileEx(
                        LPCTSTR lpExistingFileName,           // имя существующего файла
                        LPCTSTR lpNewFileName,                // имя нового файла
                        LPPROGRESS_ROUTINE lpProgressRoutine, // функция обратного вызова
                        LPVOID lpData,                        // параметры обратного вызова
                        LPBOOL pbCancel,                      // отмененный статус
                        DWORD dwCopyFlags                     // опции копирования
                      );
                       
                       
                       
                      DWORD CALLBACK CopyProgressRoutine(
                        LARGE_INTEGER  TotalFileSize,          // размер файла
                        LARGE_INTEGER  TotalBytesTransferred,  // переносимые байты
                        LARGE_INTEGER  StreamSize,             // байты в потоке
                        LARGE_INTEGER  StreamBytesTransferred, // переносимые потоком байты
                        DWORD  dwStreamNumber,                 // текущий поток
                        DWORD  dwCallbackReason,               // причина возврата
                        HANDLE  hSourceFile,                   // дескриптор источ. файла
                        HANDLE  hDestinationFile,              // дескриптор целевого файла
                        LPVOID  lpData                         // из CopyFileEx
                      );
                    M
                    Сообщения были разделены в тему "Копирование"
                    Сообщение отредактировано: Song_Bot -
                      Хорошо, с копированием разобрался. Как же быть с перемещением и УДАЛЕНИЕМ (тоже с ProgressBar)?
                        Перемешение и удаление требует предварительно составить список файлов, это если удалять не с помощью ShFileOperation. Есть простое правило, все операции по работе с файлами делать с помощью ShFileOperation, за исключением особых случаев. Кодирование простое, а пользователю знаком привычный внешний вид и поведение.
                          Для копирования, преремещения etc, можно использовать бестиповые файлы... И с ProgressBar'ом никаких проблем не будет... :)
                            Цитата Heretic2 @
                            Цитата
                            Heretic2, в FAQ есть алгоритм перебора всех файлов во всех директориях рекурсивно.
                            Используй его и для каждого выполняй процедуру копирования файла.


                            Я так уже пробовал и у меня прога вылетает, если в папке 2000 или более файлов.
                            Значит не правильно пробовал. Зачем тут рекурсия при коприровании? Рекурсия нудна только чтоб создать список файлов, а копировать можно и в цикле.
                              И в цикле тоже вылетает!!!
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,1104 ]   [ 16 queries used ]   [ Generated: 27.04.24, 12:39 GMT ]