Форум: "Начинающим";
Текущий архив: 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.068 c