Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Копирование файлов ОС   Найти похожие ветки 

 
SIV5000   (2012-02-22 15:37) [0]

Народ привет. Подскажите пожалуйста. Еть несколько способов копирования файлов/папок с файлами. Вот допустим используя TSHFileOpStruct

procedure TForm1.Button1Click(Sender: TObject) ;
var
 Fos : TSHFileOpStruct;
 Buf : array[0..4096] of char;
 p : pchar;
 sDest : string;
begin
  FillChar(Buf, sizeof(Buf), #0) ;
  p := @buf;
  p := StrECopy(p, "C:\FirstFile.ext1") + 1;
  p := StrECopy(p, "C:\SecondFile.ext2") + 1;
  StrECopy(p, "C:\ThirdFile.ext3") ;

  sDest := "e:\";

  FillChar(Fos, sizeof(Fos), #0) ;
  with Fos do
  begin
    Wnd := Handle;
    wFunc := FO_COPY;
    pFrom := @Buf;
    pTo := sDest;
    fFlags := 0;
  end;
  if ((SHFileOperation(Fos) <> 0) or (Fos.fAnyOperationsAborted <> false)) then ShowMessage("Cancelled")
end;

можно копировать как один файл так и несколько и т.п.
Все работает нормально, НО. Если к примеру копирую большой файл  то если он еще не скопировался до конца и закрыть програму то копирование файла тоже прекращаеться. Как можно копировать/перемещать файлы/папки с файлами так чтоб этот процес не зависел от програмы которая его начала. Вот напримет если скопировать файлы в експлорере и "вставить" их то окно експлорера можно спокойно закрыить а копированеи будет продолжатся.


 
AV ©   (2012-02-22 15:57) [1]

как только последнее окно закроешь - копирование остановится


 
Anatoly Podgoretsky ©   (2012-02-22 16:03) [2]

> AV  (22.02.2012 15:57:01)  [1]

Оно прекратится также если выключить компьютер.


 
SIV5000   (2012-02-22 16:30) [3]


> как только последнее окно закроешь - копирование остановится


Да. Ну а как сделать так что б при закрытии программы kопирование продолжалось???


 
sniknik ©   (2012-02-22 17:14) [4]

выполнить его от имени другой программы/в другой программе, которую не закрывают. в проводнике например. если получится конечно.
или в чемто типа COM сервера, независимого от твоей программы.


 
SIV5000   (2012-02-22 17:36) [5]


> выполнить его от имени другой программы/в другой программе

Может быть. Но как ето сделать? Может есть пример? Вообще когда в проводике скопировать файлы а потом вставить в какуюто папку, то копирование продолжаеться даже если закрыть окно проводника. Кае это там реализировано?
Как програмно вызвать "ВСТАВИТЬ" и указуть кудаб что б копированием занималась винда? Кто знает?


 
Amoeba_   (2012-02-22 17:40) [6]


> копирование продолжаеться даже если закрыть окно проводника

Но сам проводник (процесс explorer.exe) при этом не закрыт


 
QAZ   (2012-02-22 17:50) [7]


> Как можно копировать/перемещать файлы/папки с файлами так
> чтоб этот процес не зависел от програмы которая его начала.
>  Вот напримет если скопировать файлы в експлорере и "вставить"
> их то окно експлорера можно спокойно закрыить а копированеи
> будет продолжатся.

SHFileOperation


 
Amoeba_   (2012-02-22 18:23) [8]


> QAZ   (22.02.12 17:50) [7]
>
> SHFileOperation
>

Так ведь ТС енто и использует. Читай вопрос внимательнее.


 
SIV5000   (2012-02-22 18:46) [9]


> Но сам проводник (процесс explorer.exe) при этом не закрыт

Так как тогда запустить копирование от explorer.exe?


 
QAZ   (2012-02-22 19:14) [10]


> SIV5000   (22.02.12 18:46) [9]

а при чем тут експлорер
что не можеш своей проге через кс передать параметры чтоб она копировала через SHFileOperation отдельным процессом


 
SIV5000   (2012-02-22 20:34) [11]


> а при чем тут експлорерчто не можеш своей проге через кс
> передать параметры чтоб она копировала через SHFileOperation
> отдельным процессом


Блин.... Посмотри в начало темы!!!!! Я же написал что так и делаю но когда закрываю программу то и копирование тоже прекращаеться а надо что б после закрытия программы копирование продолжалось. от представь себе ты написал файловый менеджер как ты реализируэш копирование файлов ???????????????????????????????????????????????????


 
sniknik ©   (2012-02-22 21:27) [12]

explorer хитрая программа. даже когда закрываешь проводник, он не закрывается... "висит в фоне". окно просто скрывается.
можешь делать также, не закрывай до окончательного завершения копирования, просто скрывай форму.
хотя, запустить как то "от имени" кажется получше идея...  вот тут Wnd := Handle; хендл передается, что будет если подставить не своей программы а его? ну т.е. explorerа. или null.


 
DVM ©   (2012-02-22 22:00) [13]


> SIV5000

запускай дочерний процесс который и пущай копирует и дожидается окончания копирования, потом самоликвидируется, если надо то и в основном потоке его может создаваться скрытое окно.


 
sniknik ©   (2012-02-22 22:09) [14]

вот пример накатал, вроде работает (видимость создает) как задумано

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ShellAPI ;

const
 WM_SELFCLOSE = WM_USER + 100;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 private
   procedure SelfClose(var Msg: TMessage); message WM_SELFCLOSE;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

type
 TCopyThread = class(TThread)
 protected
   procedure Execute; override;
 end;

var
 isOper: boolean;

procedure FileOperation(const Source, Dest: string; Func, Flags: Integer);
var
 shf: TSHFileOpStruct;
begin
//  Отправляем файл в корзину
//  FileOperation (Source, "", FO_DELETE, FOF_ALLOWUNDO + FOF_NOCONFIRMATION);

//  Перемещаем файл в другую директорию
//  FileOperation (Source, Dest, FO_MOVE, FOF_ALLOWUNDO + FOF_NOCONFIRMATION);

//  Копируем файл в другую директорию
//  FileOperation("D:\Video\Evolution.avi", "F:\Evolution.avi", FO_COPY, FOF_ALLOWUNDO + FOF_NOCONFIRMATION);

 FillChar(shf, SizeOf (shf), #0);
 with shf do begin
   Wnd   := 0;
   wFunc := Func;
   pFrom := PChar(Source + #0);
   pTo   := PChar(Dest + #0);
   fFlags:= Flags;
 end;
 SHFileOperation(shf);
end;

procedure TCopyThread.Execute;
begin
 isOper:= true;
 FileOperation("D:\Video\Evolution.avi", "F:\Evolution.avi", FO_COPY, FOF_ALLOWUNDO + FOF_NOCONFIRMATION);
 isOper:= false;

 if not Form1.Visible then
   PostMessage(Form1.Handle, WM_SELFCLOSE, 0, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Enabled:= false;
 TCopyThread.Create(false);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 isOper:= false;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 if isOper then begin
   CanClose:= false;
   Visible := false;
 end;
end;

procedure TForm1.SelfClose(var Msg: TMessage);
begin
 Close;
end;

end.


 
QAZ   (2012-02-22 22:28) [15]


> SIV5000   (22.02.12 20:34) [11]

зачем истерить? я все верно написал
и где ты видел ФМ который четотам копирует после закрытия?


 
sniknik ©   (2012-02-22 22:36) [16]

> и где ты видел ФМ который четотам копирует после закрытия?
explorer (проводник)

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


 
SIV5000   (2012-02-23 00:03) [17]

sniknik спасибо за совет, про поток я тоже думал но ето немного не то, всеровно копирование зависит от главной формы, хочеться сделать так как в експлорере.
Ну вот все знают есть в контекстном меню команда "Копировать/Переместить в..." Возможно ли вызвать ее, при етом указав что и куда нужно копировать?


 
sniknik ©   (2012-02-23 00:30) [18]

в эксплорере также, даже еще хуже, там его "главная форма" вообще никогда не закрывается. закрывается дочернее окно.
попробуй снять его главный процесс в диспетчере задач, копирование прервется (вместе с кучей другого, например "работой" рабочего стола, и не восстановится, когда винда его на место подымет, в отличие от рабочего стола и кучи другого... :)


 
SIV5000   (2012-02-23 00:39) [19]

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


 
Германн ©   (2012-02-23 01:38) [20]


> Есть такая програмка supercopier которая заменяет встроеный
> копиер в винде (если не знал так ооочень рекомендую, прога
> супер)

Нафиг.


 
QAZ   (2012-02-23 12:02) [21]

> sniknik ©   (22.02.12 22:36) [16]
> sniknik ©   (23.02.12 00:30) [18]
странный ты чел. сам себе противоречиш
прочувствуй разницу между закрытием окна и программы

> хочеться сделать так как в експлорере.

у тебя и так сделано как в эксплорере

> Есть такая програмка supercopier которая заменяет встроеный
> копиер в винде

она не заменяет никаких встроеных копиров,а является расширением\плагином проводника и перехватывает только его действия
на твою софтину ей накласть

выб напару разобрались как винда работает,потом бы програмистов изображали

а попросить проводник работать за тебя можно только через COMинтерфейс


 
sniknik ©   (2012-02-23 12:22) [22]

> выб напару разобрались как винда работает,потом бы програмистов изображали
> а попросить проводник работать за тебя можно только через COMинтерфейс
сам перестань корчить из себя... черт знает что. критика наверное, т.е. это тот кто сам не умеет. но другим указывает почему они не правы.
про COM было сказано в [4] посте... но вот я сам что то не нашел проводника среди интерфейсов... (не web, а именно проводник), т.что у тебя есть шанс показать нам как нужно программировать... ну или еще раз "критикануть", типа "ха, это элементарно, но ничего по делу не сказать" .


 
QAZ   (2012-02-23 13:10) [23]

фигово искал
IShellBrowser,IShellView и ижесними
а мне оно нафиг ненадо за когото кнопки жать


 
sniknik ©   (2012-02-23 20:20) [24]

> IShellBrowser,IShellView и ижесними
не ком сервер, чтобы вызвать, и оставить метод на выполнение. как мне показалось. можешь разубедить. знатоку работы винды труда не составит?

> а мне оно нафиг ненадо за когото кнопки жать
ну прям классика отмазок. "критиканул" все таки.


 
QAZ   (2012-02-24 16:09) [25]

ты меня победил,я лошара



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.071 c
2-1330947283
Vyacheslav
2012-03-05 15:34
2013.03.22
Две формы: FormStyle=fsStayOnTop.. Form2 всегда выше Form1?


4-1264071675
Омлет
2010-01-21 14:01
2013.03.22
Восстановить путь ключа реестра по HKEY


2-1337342744
NieL
2012-05-18 16:05
2013.03.22
функцию, которая проверяет попадание точки в прямоугольник


1-1298637110
evgeso
2011-02-25 15:31
2013.03.22
После закрытия Ошибка Invalid Pointer Operation


2-1334441877
novichek
2012-04-15 02:17
2013.03.22
TDateTimePicker





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский