| 
| 
 | Вопрос # 6 533/ вопрос открыт / | 
 |  Все добрый день! - Есть такая проблема - значит так вот собственно код
 
 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 Move_Dir(const fromDir, toDir: string): Boolean;
var
 sr:  TSearchRec;
 fos: TSHFileOpStruct;
 fl:  TStrings;
 Buf: TBuffer;
 s1, s2, ToS: WideString;
 wF : Cardinal;
begin
 fl:= TStringList.Create;
 if fromDir=ExtractFiledir(ParamStr(0)) then //Если ЕХЕ-шник в той же папке которую хотим переместить то
   begin
    if FindFirst(fromDir + '\\' + '*.*', faAnyFile, sr) = 0 then
      repeat
        if (sr.Name = '.') or (sr.name = '..') then Continue;
        if (sr.Attr and faDirectory) <> 0 then
        begin
          fl.Add(fromDir +'\\'+ sr.Name);
         end
            else
              if sr.Name <> ExtractFileName(ParamStr(0)) then
              fl.Add(fromDir +'\\'+ sr.Name);
                until FindNext(sr) <> 0;
                  FindClose(sr);
 s1:= ExtractFileDir(ParamStr(0));  //Узнаем название папки где мы находимся
 s2:= ExtractFilepath(ExtractFileDir(ParamStr(0)));
 delete(s1, 1, length(s2));
 ToS:=toDir+s1+'\\';
 wf:=FO_MOVE;
 form1.Caption:='1'; //Индикатор 1 знать какая часть кода выполняется
 if trim(fl.Text)='' then //Если в папке только выполняемый ехе-шник
 begin
   wf:= FO_COPY;          //то папку копируем не перемешаем
   fl.Add(fromDir);
    ToS := toDir;
    form1.Caption:='3'; //Индикатор 3 знать какая часть кода выполняется
 end;
 end else
   begin                //ЕХЕ-шник вне перемешаемой папки то обычное перемешение со всей кучей
    form1.Caption:='2'; //Индикатор 2 знать какая часть кода выполняется
    fl.Add(fromDir);
    ToS := toDir;
    wf:=FO_MOVE;
   end;
 CreateBuffer(fl, Buf);
ZeroMemory(@fos, SizeOf(fos));
  with fos do
   begin
    wFunc  := wf;
    fFlags := FOF_MULTIDESTFILES + FOF_NOCONFIRMMKDIR + FOF_NOCONFIRMATION;
    pFrom  := Pointer(Buf);
    pTo    := PChar(ToS);
   end;  
 Result:= (0 = ShFileOperation(fos));
 Buf:= nil;
 fl.Free;
 
end;
 
// Используем так
var
Src, Dst, ExeDir:string;
begin
 Src:='D:\\1';
 Dst:='E:\\';
 if move_dir(src, dst)=true then
        begin
        showmessage('SUCCESFULLY! ЕХЕ-шник был в папке');
      end;
 Src:='D:\\2';
 Dst:='E:\\';
 if move_dir(src, dst)=true then
  begin
   showmessage('SUCCESFULLY! ЕХЕ-шника не было в папке');
  end;Нужно перемешать папку с которого запущен сам ЕХЕ-шник
 проблема в том что - как вы заметили в коде - если ехе-шник находиться в папке которую нужно перемешать то мы исключаем сам запущенный файл - а все остальное перемешаем
 
 Есть две проблемы
 1. Программа не перемешает если рядом с ЕХЕ-шником всего одна пустая папка
 (а если их две например Новая папка и Новая папка (2) то все без проблем перемешается)
 
 2. если рядом с ЕХЕ-шником все один файл например "Новый тектовый файл.txt" то при перемещении получаю сообщение что не получается перемешать типа Слишком длинное имя файла и все такое...
 
 В чем трабла???
 Примечание #1 (14 апреля 2014, 10:21): на двойные обратные слеши не обращать внимание - просто при предварительном просмотре они исчезали вот и двойные вставил - сори 
 
|  |   Вопрос задал: Electronic_Arts (статус: Посетитель)Вопрос отправлен: 14 апреля 2014, 10:17
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 15 апреля 2014, 10:50; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 14 апреля 2014, 10:39 [#1]: Цитата (Electronic_Arts): Нужно перемешать папку с которого запущен сам ЕХЕ-шник а зачем папку перемешивать? занимаюсь компами 24 года и первый раз такое вижу.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Electronic_Arts (статус: Посетитель), 14 апреля 2014, 10:43 [#2]:Если честно мне тоже как бы все равно - но стоит такая проблема и нужно решить... |  
|   | DNK (статус: Студент), 14 апреля 2014, 11:44 [#3]:min@y™: Судя по всему эта жертва ЕГЭ не различает два русских слова "перемеШать" и "перемеЩать" (несовершенную форму глагола "переместить"). "Digital Networked Knight" |  
|   | Electronic_Arts (статус: Посетитель), 14 апреля 2014, 12:24 [#4]:Если вам не чем помочь почему флудите?? |  
|   | min@y™ (статус: Доктор наук), 14 апреля 2014, 21:07 [#5]: Цитата (Electronic_Arts): Если вам не чем помочь почему флудите??  Помочь есть чем, но флудить ты первый начал. Не коверкай мой родной язык, не надо так! Я, конечно, понимаю, что буквы "Ш" и "Щ" находятся на соседних клавишах, но прочитать-то своё сообщение перед отправкой можно же! К тому же, можно поставить себе Punto Switcher - он анализирует ввод на лету и при откровенных ляпах подаёт звуковой сигнал.
 Вопрос номер ноль: обязательно ли делать перемещение с использованием функции ShFileOperation()? Если да, то, может быть, воспользоваться отлаженным решением, слегка доработав его напильником? Например, есть функция вот такая:
 
 function dwMoveDirFile(const Src, Dst: String; 
                       const GUI, SimpleGUI, CopyConfirmation, MkDirConfirmation, ErrorGUI: Boolean; 
                       var UserHasCancelled: Boolean): Boolean;Находится она в модуле dwFiles.pas пакета Delphi Works.Вопрос номер раз: зачем всё запихивать в единый кусок кода? Можно (и нужно) задачи разделить, но это на любителя/профессионала.
 Вообще, я очень не люблю ковырять чужой код в поискаж чужих ошибок, ибо на это есть отладчик. Мне проще написать и отладить свой код с нуля.
 
 Цитата (Electronic_Arts): 1. Программа не перемешает если рядом с ЕХЕ-шником всего одна пустая папка (а если их две например Новая папка и Новая папка (2) то все без проблем перемешается)2. если рядом с ЕХЕ-шником все один файл например "Новый тектовый файл.txt" то при перемещении получаю сообщение что не получается перемешать типа Слишком длинное имя файла и все такое...
 Вопрос номер два: отладчиком воспользоваться пробовал или ещё нет?
 
 Жду ответов.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Electronic_Arts (статус: Посетитель), 15 апреля 2014, 10:50 [#6]:Извини я не хотел коверкать твой язык...мне его в школе не проходили - я сам научился..по этому думаю можно простить.. 
 А так да ты прав запустил отладку - оказалось проблема в том что нужно было сперва создать папку а потом перемещать данные - при перемещении TSHFileOpStruct не находил Destination folder вот и вел себя так странно..
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |