Оффтоп:
Цитата:
Сообщение от Electronic_Arts
[b]...Просто если бы это была тупо проблема в WINAPI то почему если я рядом создам еще одну папку "Новая папка (2)" то несмотря на то что они пустые то они перемешаются оба??
|
Не в натуре это эйпиайный прикол, ну любят в мелкомяконьких за людей думать что и как надо делать, факт
Появилась идея обмана - если папка-пустышка одна одинёшенька была, то создать её принудительно или пропустить это дело, если есть ещё файлы-папки, пусть
ShFileOperation это делает дальше сама
Код:
function MoveDir(fromDir, toDir: string): Boolean;
var
sr:TSearchRec;
fos: TSHFileOpStruct;
fl: TStrings;
SrcBuf : TBuffer;
dl: string; // добавлено
begin
fl:= TStringList.Create;
if (fromDir <> '') and (fromDir[Length(fromDir)]<>'\') then fromDir:= fromDir+'\';
if FindFirst(fromDir + '*.*', faAnyFile, sr) = 0 then
repeat
if (sr.Name = '.') or (sr.name = '..') then Continue;
if (sr.Attr and faDirectory) <> 0 then
begin
dl:= toDir + sr.Name; // добавлено
fl.Add(fromDir + sr.Name);
MoveDir(fromDir + sr.Name, toDir);
end else
if sr.Name <> ExtractFileName(ParamStr(0)) then fl.Add(fromDir + sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
CreateBuffer( fl, SrcBuf );
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_MOVE;
fFlags := FOF_FILESONLY or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
pFrom := Pointer(SrcBuf);
pTo := PChar(toDir)
end;
Result:= (0 = ShFileOperation(fos));
SrcBuf:= nil;
if (fl.Count = 1) and (dl <> '') then ForceDirectories(dl); // добавлено
fl.Free;
end;
Извнт, не по вашей модификации шил, придётся вам свои прибамбасы ещё раз прикручивать, но вроде это не смертельно. Проверил в таком варианте несколько раз - работает