|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
Подайте идею как перемещать самого себя
Столкнулся с такой проблемой...
Код:
function MoveDir(const fromDir, toDir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_MOVE;
fFlags := FOF_FILESONLY;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir)
end;
Result := (0 = ShFileOperation(fos));
end; Когда программа сама тоже находится в перемещаемой папке то выскакивает окно что не получается перемешать файл так как он занять....если нажать кнопку ПРОПУСТИТЬ то все ОК перемещение заканчивается удачно... Просто как можно при перемещении сделать так чтоб все переместилось без кроме самого ЕХЕ-шника чтоб избежать ошибку??? Нет ничего не возможного. Вопрос только во времени... |
#2
|
||||
|
||||
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Electronic_Arts (12.04.2014)
|
#3
|
||||
|
||||
Ща попробуем...спасибо
Что то не получается обходить ошибку Код:
try if MoveDir(Src, Dst) = True then begin ... ... end; Except {тут я понимаю что обрабатывается исключение но по моему моя ошибка выскакивает прежде чем дело доходит до сюда} end; Или я что то не правильно делаю?? Нет ничего не возможного. Вопрос только во времени... Последний раз редактировалось M.A.D.M.A.N., 11.04.2014 в 18:08. |
#4
|
||||
|
||||
Цитата:
В справке написано, что для того чтобы не отображались сообщения об ошибках нужно указать флаг FOF_NOERRORUI: Код:
..... fFlags := FOF_FILESONLY or FOF_NOERRORUI; ..... |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Electronic_Arts (12.04.2014)
|
#5
|
||||
|
||||
Спасибо за ссылку - ша посмотрю какой флаг за что отвечает...
В обычном значении fFlags := FOF_FILESONLY получаю вот это Если тут не нажать пропустить то я не получаю сообщение об удачном перемещении... А если fFlags := FOF_FILESONLY or FOF_NOERRORUI получаю это Хотя папка перемешаеться туда где никаких копий EXE-шника нету точнее файл создается при перемещении а потом система ругается типа уже есть и тут тоже если не нажать пропустить то я не получу сообщение об успешном переезде Дело в том что мне и не нужно сам ЕХЕ-шник перемешать - достаточно чтоб все остальное перемешался удачно а сам ЕХЕ-шник игнорировался У меня насчет этой проблемы всего две идеи - написать дополнительный модуль которая по параметрам из основного ЕХЕшника будет выполнять перемещение запустив себя из другой папки... Потом думаю можно словить хендл окна которая выскакивать и найти на нем кнопку "пропустить" и нажать.. - но как можно исключить при перемещении самого себя?? Нет ничего не возможного. Вопрос только во времени... Последний раз редактировалось M.A.D.M.A.N., 11.04.2014 в 18:08. |
#6
|
||||
|
||||
Структуре TSHFileOpStruct в качестве параметра pFrom можно передать просто список файлов без экзешника (в виде PString т.е. имена идут через #0, в конце ещё + #0), тогда и исключений не будет
Код:
type
TBuffer = array of Char;
procedure CreateBuffer(Names: TStrings; var P: TBuffer);
var
i, j, l : integer;
begin
for i := 0 to Names.Count-1 do
begin
l:= Length(P);
SetLength(P, L+Length(Names[i])+1);
for j := 0 to Length(Names[i])-1 do P[l+j]:= Names[i][j+1];
P[l + j]:= #0;
end;
SetLength(P, Length(P)+1);
P[Length(P)]:= #0;
end;
function MoveDir(const fromDir, toDir: string): Boolean;
var
sr: TSearchRec;
fos: TSHFileOpStruct;
fl: TStrings;
Buf: TBuffer;
begin
fl:= TStringList.Create;
if FindFirst(fromDir + '*.*', faAnyFile, sr) = 0 then
repeat
if (sr.Name = '.') or (sr.name = '..') then Continue;
if (sr.Attr and faDirectory) <> 0 then MoveDir(fromDir + sr.Name, toDir)
else
if sr.Name <> ExtractFileName(ParamStr(0)) then fl.Add(fromDir + sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
CreateBuffer(fl, Buf);
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_MOVE;
fFlags := FOF_FILESONLY or FOF_NOCONFIRMMKDIR;
pFrom := Pointer(Buf);
pTo := PChar(toDir)
end;
Result:= (0 = ShFileOperation(fos));
Buf:= nil;
fl.Free;
end; Код:
if MoveDir(ExtractFileDir(ParamStr(0)) + '\', 'C:\TMP') then Caption:= 'Done'; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Electronic_Arts (12.04.2014)
|