Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск каталогов

Ответить
Настройки темы
[решено] Поиск каталогов

Аватара для TERMINAL

Ветеран


Сообщения: 753
Благодарности: 28

Профиль | Отправить PM | Цитировать


Здравствуйте ! Погуглив так и не нашёл ответа или примера как возможно найти папку 5DEL во всех подкаталогах папки TEST, глубина папки TEST неизвестна, и удалить все найденные каталоги 5DEL.
Заранее спс.

-------
Автоматизация прежде всего....


Отправлено: 13:24, 26-12-2012

 

Старожил


Сообщения: 352
Благодарности: 44

Профиль | Отправить PM | Цитировать


madmasles, В функции
Цитата:
Func _FileDirList($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles

If Not StringInStr(FileGetAttrib($sPath), "D") Then
Return SetError(1, 0, 0)
EndIf

If $iSubDir = 1 Then
$sAttrib &= ' /S'
EndIf

If $iSort = 1 Then
$sAttrib &= ' /O:N'
EndIf

Switch $iFlag
Case 1
$sAttrib &= ' /A-D'
Case 2
$sAttrib &= ' /AD'
Case Else
$sAttrib &= ' /A'
EndSwitch

$sOut = StringToBinary('0' & @CRLF, 2)
$sPath = StringRegExpReplace($sPath, '\\+$', '')
$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
$aMasks = StringSplit($sFileMask, ';')

For $i = 1 To $aMasks[0]
If StringStripWS($aMasks[$i], 8) = "" Then
ContinueLoop
EndIf

$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

If $i < $aMasks[0] Then
$sFiles &= ';'
EndIf
Next

$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

While ProcessExists($hDir)
$sRead = StdoutRead($hDir, False, True)

If @error Then
ExitLoop
EndIf

If $sRead <> "" Then
$sOut &= $sRead
EndIf
WEnd

$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

If @error Or UBound($aOut) < 2 Then
Return SetError(2, 0, 0)
EndIf


$aOut[0] = UBound($aOut) - 1
Return $aOut
EndFunc ;==>_FileDirList
выделенное жирным, иногда вылетает ошибка
Error: Subscript used with non-Array variable. Как возможно предотвратить ошибку ? Return 0 ?

Отправлено: 11:13, 29-01-2013 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для AZJIO

Старожил


Сообщения: 254
Благодарности: 126

Профиль | Отправить PM | Цитировать


-TRM-, использовать проверенную функцию пару постов выше, которую я уже пол-года использую в синхронизаторе файлов. После синхронизации имеет место появление пустых каталогов в виду удаления файлов, пришлось сделать поиск и удаление пустых каталогов. Пользуюсь вроде полгода, ни одного вылета.

Отправлено: 11:35, 29-01-2013 | #12


Старожил


Сообщения: 352
Благодарности: 44

Профиль | Отправить PM | Цитировать


AZJIO, Я так понял Вы предлагаете использовать функцию _FO_SearchEmptyFolders ?!
Дело в том, что в функции,madmasles, которую предложил madmasles, папки тоже находятся, но проблема ещё и в другом: Если путь С:\Papka1\Papka2\Papka3\Papka4\Papka5 и в ней получается пустая папка Papka5 и в папках С:\Papka1\Papka2\Papka3\Papka4 тоже ничего нет, то функция удаляет только Papka5, а не весь путь С:\Papka1\Papka2\Papka3\Papka4\Papka5, поэтому приходиться в цикл кидать и проверять один путь несколько раз. А у Вас как в этой функции дело обстоит?

Отправлено: 11:59, 29-01-2013 | #13


Аватара для AZJIO

Старожил


Сообщения: 254
Благодарности: 126

Профиль | Отправить PM | Цитировать


-TRM-, а у нас два флага, удалять только совсем пустые каталоги и удалять каталог который может содержать сколько угодно пустых каталогов.
Цитата:
$iType [необязательный] (0,1) определяет, совсем пустые папки или разрешить каталог c пустыми папками, не добавляя вложенных
0 - папка может содержать пустые папки, не добавляя последние к списку (по умолчанию)
1 - папки пусты совсем
Тебе нужен 0.

Последний раз редактировалось AZJIO, 29-01-2013 в 12:29.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:24, 29-01-2013 | #14


Старожил


Сообщения: 352
Благодарности: 44

Профиль | Отправить PM | Цитировать


AZJIO, А как правильно понять выражение &=
Цитата:
Func __FO_SearchEmptyFolders1($sPath)
Local $sFolderList = '', $sFile, $s = FileFindFirstFile($sPath & '*')
If $s = -1 Then Return $sPath & @CRLF
While 1
$sFile = FileFindNextFile($s)
If @error Then ExitLoop
If @extended Then
$sFolderList &= __FO_SearchEmptyFolders1($sPath & $sFile & '\')
EndIf
WEnd
FileClose($s)
Return $sFolderList
EndFunc ;==>__FO_SearchEmptyFolders1
Это не зацикливание функции (одна в одной) ? И как понять выражение $iFill += 1 ?

Где нужно вставить команду удаления папки ? Ведь мне выводится уже полный список путей пустых папок, а не по одному пути.

Последний раз редактировалось -TRM-, 02-02-2013 в 11:54.


Отправлено: 11:45, 02-02-2013 | #15


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Цитата -TRM-:
как правильно понять выражение &= »
Код: Выделить весь код
$a &= 'something';
$a = $a & 'something'
Цитата -TRM-:
как понять выражение $iFill += 1 ? »
Код: Выделить весь код
$a += 1
$a = $a + 1

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:00, 02-02-2013 | #16


Старожил


Сообщения: 352
Благодарности: 44

Профиль | Отправить PM | Цитировать


AZJIO,
Цитата:
Примечания ..: Основная цель функции - последующее удаление пустых папок по найденному списку
Где нужно вставить команду удаления папки ? Ведь мне выводится уже полный список путей пустых папок, а не по одному пути-что-то разобраться не могу.

Последний раз редактировалось -TRM-, 02-02-2013 в 12:36.


Отправлено: 12:20, 02-02-2013 | #17


Аватара для AZJIO

Старожил


Сообщения: 254
Благодарности: 126

Профиль | Отправить PM | Цитировать


-TRM-, Вот пример:

Код: Выделить весь код
#include <Array.au3>
#include <FileOperations.au3>

$timer = TimerInit() ; таймер для скорости поиска
$aFolderList = _FO_SearchEmptyFolders(@WindowsDir) ; путь для примера поиска, НЕ СЛЕДУЕТ УДАЛЯТЬ в нём пустые папки
_ArrayDisplay($aFolderList, 'Время : ' & Round(TimerDiff($timer) / 1000, 2) & ' сек', -1, 0, '', '|', '№|Пустые папки') ; просмотр найденных пустыых папок

If MsgBox(4 + 262144, 'Сообщения', 'Удалить пустые папки ?') = 6 Then ; если ответ равен 6, что значить "Да", тогда
    $err = '' ; переменная для лога ошибок
    For $i = 1 To $aFolderList[0] ; цикл удаления папок
        If Not FileRecycle($aFolderList[$i]) Then ; если не удалось переместить в корзину, тогда
            If Not (FileSetAttrib($aFolderList[$i], '-RST') And FileRecycle($aFolderList[$i])) Then ; если не удалось снять атрибуты и переместить в корзину, тогда
                $err &= $aFolderList[$i] & @CRLF ; пишем лог
            EndIf
        EndIf
    Next
    If $err Then MsgBox(0, 'Лог ошибок', $err) ; если лог ошибок не пустой, то смотрим его
EndIf

; FileRecycle($aFolderList[$i]) ; удаление в корзину
; DirRemove($aFolderList[$i], 1) ; удаление навсегда
1. UDF пишется не для того чтобы в него что-то вписывали. Всё что надо в него вписать передаётся через параметры, иначе весь смысл UDF пропадает.
2. Я вот подумал, а что если у вложенной пустой папки атрибут только чтение? Тогда думаю папку невозможно удалить, если используется поиск с ключом 0, то есть надо получить именно папки которые пусты совсем, тогда есть гарантия что при неудалении атрибуты будут сняты, чтобы удалить.

Цитата -TRM-:
Это не зацикливание функции (одна в одной) ? »
это зацикливание и называется рекурсией. Глубина рекурсии не превышает 123 (количество максимально возможных вложений папок)

Последний раз редактировалось AZJIO, 03-02-2013 в 05:57.


Отправлено: 05:01, 03-02-2013 | #18


Старожил


Сообщения: 352
Благодарности: 44

Профиль | Отправить PM | Цитировать


AZJIO, Выскакивет
For $i = 1 To $aFolderList[0]
For $i = 1 To $aFolderList^ ERROR
Какого ?, никак понять не могу, папка не содержит пустые папки и на ней затык
Вот эта папка

Последний раз редактировалось -TRM-, 04-02-2013 в 16:49.


Отправлено: 16:36, 04-02-2013 | #19


Аватара для AZJIO

Старожил


Сообщения: 254
Благодарности: 126

Профиль | Отправить PM | Цитировать


-TRM-, У тебя папка не содержит пустых папок. После вызова _FO_SearchEmptyFolders забыл добавить строку:
Код: Выделить весь код
If @error Then Exit
Ну разве догадаться не можешь, если нет массива то и цикл отработать не сможет.
Твой архив не качал, пока некогда.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:53, 04-02-2013 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск каталогов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск, остановка процесса, поиск и замена файла на разных дисках Gawr33 Скриптовые языки администрирования Windows 11 23-04-2011 23:09
CMD/BAT - [решено] Поиск, остановка процесса, поиск и замена файлов на разных дисках 4zz Скриптовые языки администрирования Windows 2 21-02-2011 16:07
CMD/BAT - Синхронизация каталогов Makzs Скриптовые языки администрирования Windows 4 03-11-2009 15:56
Поиск скрытых каталогов на диске fooms Хочу все знать 5 05-02-2004 09:56
20-ка поисковиков и каталогов Agent Comanche Вебмастеру 6 18-06-2003 01:52




 
Переход