Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.04.2014, 21:58
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 559
Версия Delphi: XE5
Репутация: 18
Восклицание Подайте идею как перемещать самого себя

Столкнулся с такой проблемой...
Код:
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  
Старый 10.04.2014, 22:03
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Electronic_Arts
Когда программа сама тоже находится в перемещаемой папке то выскакивает окно что не получается перемешать файл так как он занять....если нажать кнопку ПРОПУСТИТЬ то все ОК перемещение заканчивается удачно...

Просто как можно при перемещении сделать так чтоб все переместилось без кроме самого ЕХЕ-шника чтоб избежать ошибку???
Исключение можно подавить конструкцией try...except
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Electronic_Arts (12.04.2014)
  #3  
Старый 10.04.2014, 22:06
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 559
Версия Delphi: XE5
Репутация: 18
Восклицание

Ща попробуем...спасибо

Что то не получается обходить ошибку
Код:
try
  if MoveDir(Src, Dst) = True then
    begin
    ...
    ...
    end;
 Except
{тут я понимаю что обрабатывается исключение но 
по моему моя ошибка выскакивает прежде чем дело доходит до сюда}
end;
Так как там же идет проверка НА САМОМ ЛИ ДЕЛЕ ВСЕ ПЕРЕМЕСТИЛОСЬ если да то идем дальше...
Или я что то не правильно делаю??
__________________
Нет ничего не возможного. Вопрос только во времени...

Последний раз редактировалось M.A.D.M.A.N., 11.04.2014 в 18:08.
Ответить с цитированием
  #4  
Старый 11.04.2014, 00:51
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Electronic_Arts
Что то не получается обходить ошибку
Да, это не исключение, это сообщение об ошибке отображает оболочка, поэтому try...except здесь не поможет.
В справке написано, что для того чтобы не отображались сообщения об ошибках нужно указать флаг FOF_NOERRORUI:
Код:
.....
    fFlags := FOF_FILESONLY or FOF_NOERRORUI;
.....
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Electronic_Arts (12.04.2014)
  #5  
Старый 11.04.2014, 01:10
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 559
Версия Delphi: XE5
Репутация: 18
Восклицание

Спасибо за ссылку - ша посмотрю какой флаг за что отвечает...

В обычном значении fFlags := FOF_FILESONLY
получаю вот это




Если тут не нажать пропустить то я не получаю сообщение об удачном перемещении...

А если fFlags := FOF_FILESONLY or FOF_NOERRORUI получаю это



Хотя папка перемешаеться туда где никаких копий EXE-шника нету точнее файл создается при перемещении а потом система ругается типа уже есть и тут тоже если не нажать пропустить то я не получу сообщение об успешном переезде

Дело в том что мне и не нужно сам ЕХЕ-шник перемешать - достаточно чтоб все остальное перемешался удачно а сам ЕХЕ-шник игнорировался

У меня насчет этой проблемы всего две идеи

- написать дополнительный модуль которая по параметрам из основного ЕХЕшника будет выполнять перемещение запустив себя из другой папки...

Потом думаю можно словить хендл окна которая выскакивать и найти на нем кнопку "пропустить" и нажать..

- но как можно исключить при перемещении самого себя??
__________________
Нет ничего не возможного. Вопрос только во времени...

Последний раз редактировалось M.A.D.M.A.N., 11.04.2014 в 18:08.
Ответить с цитированием
  #6  
Старый 11.04.2014, 17:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Структуре 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';
немного страшновато выглядит, нету времени чтоб собрать что-то более элегантное, посему это то что в DRKB было. Проверил, работает
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Electronic_Arts (12.04.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter