Что нового

Удалить папку

DanSaratov

Новичок
Сообщения
112
Репутация
1
Функция _FileListToArrayRec() блокирует папку, и её не получается удалить функцией DirRemove, удаляются только файлы, а папка и подпапки остаются.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
DanSaratov
Код?
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
Код:
#include <file.au3>
$dir = @DesktopDir & '\test\'
$aDirList = _FileListToArrayRec($dir,default,4+8+2,1)
DirRemove($dir,1)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
DanSaratov [?]
Функция _FileListToArrayRec() блокирует папку, и её не получается удалить функцией DirRemove
Данный пример показывает что это не так:

Код:
#include <Array.au3>
#include <File.au3>

$sDir = @TempDir & '\test_dir\sub_dir'
DirCreate($sDir)
FileWrite($sDir & '\test.txt', '')

$aList = _FileListToArrayRec($sDir)
_ArrayDisplay($aList)

MsgBox(64, 'Before DirRemove', FileExists($sDir)) ;1
DirRemove($sDir, 1)
MsgBox(64, 'After DirRemove', FileExists($sDir)) ;0
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
sub_dir удаляется, а основная - нет
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Если в функции используется API-поиск, то не нашел вызова FindClose (kernel32.dll). Я не уверен, что FileClose() закрывает handle поиска. Может быть, в этом дело?
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
Код:
#include <Array.au3>
#include <File.au3>


$Dir = @TempDir & '\test_dir\'
$sDir = $Dir & 'sub_dir'
DirCreate($sDir)
FileWrite($Dir & '\test.txt', '')
$aList = _FileListToArrayRec($Dir, Default, 4 + 8 + 1, 1)
_ArrayDisplay($aList)
MsgBox(64, '[_FileListToArrayRec]Before DirRemove', FileExists($Dir) & @CRLF & FileExists($sDir)) ;1 1
DirRemove($Dir, 1)
MsgBox(64, '[_FileListToArrayRec]After DirRemove', FileExists($Dir) & @CRLF & FileExists($sDir)) ;1 1



$Dir = @TempDir & '\test_dir2\'
$sDir = $Dir & 'sub_dir2'
DirCreate($sDir)
FileWrite($Dir & '\test2.txt', '')
MsgBox(64, 'Before DirRemove', FileExists($Dir) & @CRLF & FileExists($sDir)) ;1 1
DirRemove($Dir, 1)
MsgBox(64, 'After DirRemove', FileExists($Dir) & @CRLF & FileExists($sDir)) ;0 0



Добавлено:
Сообщение автоматически объединено:

Если после выполнения _FileListToArrayRec() остановить программу(msgbox и т.п), то через проводник и через Total Commander папка тоже не удаляется. Выходит сообщение : Запросите разрешение от "Имя компьютера\Имя пользователя" на изменение этой папки



Добавлено:
Сообщение автоматически объединено:

Такое поведение наблюдается только если искать ещё и в подпапках основной папки.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В функции _FileListToArrayRec (библиотека File.au3) нужно заменить:

Код:
; Close current search
		FileClose($hSearch)


на
Код:
; Close current search
		If $iHide_HS Or $iHide_Link Then
			DllCall($hDLL, 'int', 'FindClose', 'ptr', $hSearch)
		Else
			FileClose($hSearch)
		EndIf
 
Верх