Что нового

[Баг] DirCopy не копирует вложенные папки если исходный путь равен пути назначения

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 125
Репутация
2 323
Пример:
Код:
DirCopy(@ScriptDir, @ScriptDir & '\backup', 1)

тут копируются в папку backup только файлы, без папок.

Вот так я это обхожу на данный момент:

Код:
#include <File.au3>

$aDirs = _FileListToArray(@ScriptDir, '*', 2, False)

DirCopy(@ScriptDir, @ScriptDir & '\backup', 1)

For $i = 1 To Ubound($aDirs) - 1
	DirCopy(@ScriptDir & '\' & $aDirs[$i], @ScriptDir & '\backup\' & $aDirs[$i], 1)
Next


Это баг или я что то путаю? :scratch:
 

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
CreatoR [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26729.msg147623#msg147623')][?][/url_ex]
тут копируются в папку backup только файлы, без папок
Папки тоже копируются, но только если их имена "меньше" по списку. Например, для "backup" будут скопированы папки "123" и "asd", но не будут "qwe" и "Новая папка". Вероятно, процесс останавливается при копировании папки самой в себя (проводник, кстати, выводит сообщение при таком конфликте, но остальные папки копирует).

Вот так я это обхожу на данный момент
Назовите папку "яbackup" и она будет последней в списке ;)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 125
Репутация
2 323
InnI [?]
Назовите папку "яbackup" и она будет последней в списке
А потом переименовать, ну да тоже вариант, но вопрос в том, баг ли это, или нет...
 

Cytrus

Чайник
Сообщения
86
Репутация
1
Это не баг.

Как вы скопируете папку саму в себя?
Она же элементарно в этот момент недоступна, потому как открыты её хэндлы.

Типа, FileFindFirstFile.

Да и вообще, была бы бесконечная рекурсия.
По аналогии, сам себе залезть в зад. :shok:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 125
Репутация
2 323
Cytrus [?]
Как вы скопируете папку саму в себя?
Не в саму себя, а подпапку Backup, впрочем я уже понял что это ограничение самой ОС, т.ч да, это не баг.

Она же элементарно в этот момент недоступна, потому как открыты её хэндлы
Дело не в этом, а скорее в...
была бы бесконечная рекурсия
 

xXx

Меценат
Меценат
Сообщения
85
Репутация
25
[off title=OffTopic]
CreatoR сказал(а):
... А потом переименовать...
Не очень удобно, если такая папка уже есть. Вот еще возможный костыль:
Код:
DirCopy(@ScriptDir, @ScriptDir & '\..\backup')
DirMove(@ScriptDir & '\..\backup', @ScriptDir & '\backup', 1)
[/off]
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 125
Репутация
2 323
xXx [?]
Вот еще возможный костыль
Ну я решил делать это "корректно":

Код:
Func _DirBackup($sSrc, $sDest)
	Local $hFile = FileFindFirstFile($sSrc & '\*')
	Local $sFile
	
	While 1
		$sFile = FileFindNextFile($hFile)
		
		If @error Then
			ExitLoop
		EndIf
		
		If @extended Then
			DirCopy($sSrc & '\' & $sFile, $sDest & '\' & $sFile, 1)
		Else
			FileCopy($sSrc & '\' & $sFile, $sDest & '\' & $sFile, 9)
		EndIf
	WEnd
	
	FileClose($hFile)
EndFunc
 
Верх