Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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. Delphi XE5
  2. Windows 7


Примечание #1 (14 апреля 2014, 10:21):
на двойные обратные слеши не обращать внимание - просто при предварительном просмотре они исчезали вот и двойные вставил - сори

Electronic_Arts Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Electronic_Arts (статус: Посетитель)
Вопрос отправлен: 14 апреля 2014, 10:17
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 15 апреля 2014, 10:50; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 14 апреля 2014, 10:39 [#1]:

Цитата (Electronic_Arts):

Нужно перемешать папку с которого запущен сам ЕХЕ-шник

а зачем папку перемешивать? занимаюсь компами 24 года и первый раз такое вижу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Electronic_Arts

Electronic_Arts (статус: Посетитель), 14 апреля 2014, 10:43 [#2]:

Если честно мне тоже как бы все равно - но стоит такая проблема и нужно решить...
DNK

DNK (статус: Студент), 14 апреля 2014, 11:44 [#3]:

min@y™: Судя по всему эта жертва ЕГЭ не различает два русских слова "перемеШать" и "перемеЩать" (несовершенную форму глагола "переместить").
"Digital Networked Knight"
Electronic_Arts

Electronic_Arts (статус: Посетитель), 14 апреля 2014, 12:24 [#4]:

Если вам не чем помочь почему флудите??
min@y™

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

Electronic_Arts (статус: Посетитель), 15 апреля 2014, 10:50 [#6]:

Извини я не хотел коверкать твой язык...мне его в школе не проходили - я сам научился..по этому думаю можно простить..

А так да ты прав запустил отладку - оказалось проблема в том что нужно было сперва создать папку а потом перемещать данные - при перемещении TSHFileOpStruct не находил Destination folder вот и вел себя так странно..

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 18 июня 2018, 02:44
Выполнено за 0.1 сек.
Рейтинг@Mail.ru