Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пример:
Код:
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,912
Репутация
1,429
CreatoR [?]
тут копируются в папку backup только файлы, без папок
Папки тоже копируются, но только если их имена "меньше" по списку. Например, для "backup" будут скопированы папки "123" и "asd", но не будут "qwe" и "Новая папка". Вероятно, процесс останавливается при копировании папки самой в себя (проводник, кстати, выводит сообщение при таком конфликте, но остальные папки копирует).

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

CreatoR

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

Cytrus

Новичок
Сообщения
110
Репутация
3
Это не баг.

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

Типа, FileFindFirstFile.

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

CreatoR

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

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

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
OffTopic:
CreatoR сказал(а):
... А потом переименовать...
Не очень удобно, если такая папка уже есть. Вот еще возможный костыль:
Код:
DirCopy(@ScriptDir, @ScriptDir & '\..\backup')
DirMove(@ScriptDir & '\..\backup', @ScriptDir & '\backup', 1)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
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
 
Верх