|
Вопрос # 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 вот и вел себя так странно..
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|