PDA

Показать полную графическую версию : [решено] @WorkingDir:> find(pro) [not exe] *.*


semiono
13-07-2009, 21:28
Нужна "утилита" скрипт, чтобы искать по маске, однако действие обратное!
Иными словами, чтоб задавать паттерн - найти все НЕ {txt или exe или pdf или zip итп.} файлы в текущей директории.
?

ЗЫ очень удобно проверить подкаталоги содеражащие определённый контент, скажем только *.zip на наличие
какого либо случайного мусора, типа всяких *.nfo или *.bak или ещё чего *.~ итд.

Yashied
13-07-2009, 22:20
Способ 1. FileFindFirstFile() и FileFindNextFile()
Способ 2. _FileListToArray($sPath, '*', 1), затем удали из массива ненужные.

proxy
13-07-2009, 23:13
Способ 1. FileFindFirstFile() и FileFindNextFile()
Способ 2. _FileListToArray($sPath, '*', 1), затем удали из массива ненужные. »
а заме потом? сразу в ходе действия - заностить в массив только нужные.
вернее если тип файла не нужный - то не заносить.

И пример, с перебором подпапок:


#region: - Options
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 0)
Opt('TrayIconHide', 1)
#endregion

#region: - Include
#include <Array.au3>
#include <GuiEdit.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#endregion

Local $sSerchInDirPath = 'd:\Обмен'
Local $sFilesSerchRegMask = '.*'
Local $sNoFilesSerchRegMask = '(?i)txt|lnk|jpg|exe|pdf|zip'
Local $sDirsSerchRegMask = '.*'
Local $aSubResultList = _GetFilesDirsList($sSerchInDirPath, $sFilesSerchRegMask, $sNoFilesSerchRegMask, $sDirsSerchRegMask, 1, 1, 0)

_ArrayDisplay($aSubResultList, 'Result list')

Func _GetFilesDirsList($sSerchInDirPath, $sFilesSerchRegMask='.*', $sNoFilesSerchRegMask='', $sDirsSerchRegMask='.*', $iAddFiles=1, $iAddDirs=0, $fSerchInWrongDir=1, $sRootPath=1, $fAddFromRootDir=1)
$sSerchInDirPath = StringRegExpReplace($sSerchInDirPath, '\\+$', '')
Local $aResultList[1], $aSubResultList[1], $aSub2ResultList[1], $hSerch, $sFileName, $sFilePath, $fAddToResult, $fIsDir, $fDirsSerchRegMask, $fFilesSerchRegMask, $fSerchInWrongDirSub, $fAddFromRootDirSub, $i
$aResultList[0] = 0

$hSerch = FileFindFirstFile($sSerchInDirPath & '\' & '*')
If @error Then Return SetError(1, 0, $aResultList)

If $sRootPath == 1 AND $iAddDirs == 1 AND $fAddFromRootDir Then
$aResultList[0] += 1
ReDim $aResultList[$aResultList[0]+1]
$aResultList[$aResultList[0]] = $sSerchInDirPath
EndIf

While 1
$sFileName = FileFindNextFile($hSerch)
If @error == 1 Then ExitLoop

$sFilePath = $sSerchInDirPath & '\' & $sFileName

$fAddToResult = 0
$fIsDir = StringInStr(FileGetAttrib($sFilePath), 'D')
$fDirsSerchRegMask = StringRegExp(StringRegExpReplace($sFilePath, '.+\\(.+)$', '\1'), $sDirsSerchRegMask)
$fFilesSerchRegMask = StringRegExp(StringRegExpReplace($sFilePath, '.+\\(.+)$', '\1'), $sFilesSerchRegMask)
If $fFilesSerchRegMask Then _
$fFilesSerchRegMask = NOT StringRegExp(StringRegExpReplace($sFilePath, '.+\\(.+)$', '\1'), $sNoFilesSerchRegMask)

$fAddFromRootDirSub = 1
If NOT $fDirsSerchRegMask Then $fAddFromRootDirSub = 0

If $fIsDir Then
If $iAddDirs == 1 AND $fDirsSerchRegMask Then $fAddToResult = 1
Else
If $iAddFiles == 1 AND $fFilesSerchRegMask AND $fAddFromRootDir Then $fAddToResult = 1
EndIf

If $fAddToResult Then
If $sRootPath == 1 AND NOT $fIsDir Then
$aResultList[0] += 1
ReDim $aResultList[$aResultList[0]+1]
$aResultList[$aResultList[0]] = $sFilePath
Else
$aSubResultList[0] += 1
ReDim $aSubResultList[$aSubResultList[0]+1]
$aSubResultList[$aSubResultList[0]] = $sFilePath
EndIf
EndIf

$fSerchInWrongDirSub = 1
If NOT $fSerchInWrongDir AND $fIsDir AND NOT $fDirsSerchRegMask Then $fSerchInWrongDirSub = 0

$aSub2ResultList[0] = 0
If $fIsDir Then
If $fSerchInWrongDirSub Then _
$aSub2ResultList = _GetFilesDirsList($sFilePath, $sFilesSerchRegMask, $sNoFilesSerchRegMask, $sDirsSerchRegMask, $iAddFiles, $iAddDirs, $fSerchInWrongDir, 0, $fAddFromRootDirSub)
EndIf

If $aSub2ResultList[0] Then
For $i = 1 To $aSub2ResultList[0]
$aSubResultList[0] += 1
ReDim $aSubResultList[$aSubResultList[0]+1]
$aSubResultList[$aSubResultList[0]] = $aSub2ResultList[$i]
Next
EndIf
WEnd

FileClose($hSerch)

For $i=1 To UBound($aSubResultList)-1
$aResultList[0] += 1
ReDim $aResultList[$aResultList[0]+1]
$aResultList[$aResultList[0]] = $aSubResultList[$i]
Next

Return SetError(0, 0, $aResultList)
EndFunc

Yashied
13-07-2009, 23:51
а заме потом? сразу в ходе действия - заностить в массив только нужные.
вернее если тип файла не нужный - то не заносить. »
Это относится к 2-у способу _FileListToArray()

proxy, ты наверное альтруист, всем даешь готовые (полностью рабочие) решения. А вдруг человек сам хочет додуматься и ему нужна только подсказка в каком направлении, так сказать, двигаться. А дальше он сам ХОЧЕТ решить эту задачу. Хотя я в этом сильно сомневаюсь. :help:

Если всем давать готовые решения, то этот форум долго будет оставаться таким медлительным (2-3 поста в день :( ). Нужно людям помогать и давать думать, а не лишать их этого. В конце концов по оформлению топика сразу видно, что человек хочет: получить готовое решение или он действительно зашел в тупик и ему нужна подсказка (всего лишь намек). А может он вообще ошибся форумом или заранее знает, что здесь есть добрый и замечательный proxy, который для всех готов писать программы по своей доброте душевной. Причем, даже можно точно не расписывать свою проблему, он ведь догадливый и сам все поймет. Но это лишь мое личное мнение, без обид.

proxy
14-07-2009, 00:03
А вдруг человек сам хочет додуматься и ему нужна только подсказка в каком направлении, »
вот для этого выше и есть твои и мои к ним обсуждения ;)
имхо, если человек хочет сам - что ему мешает в этом разбираться? в примере разбираться? посмотреть на пример и дальше спросить на форуме что и как?
если он хочет - то будет разбираться! ...я против насилия - только хорошим можно сотворить хорошее ) если ему подошел пример - что в этом зазорного?
У меня эта функция уже готовая: перебор папок с подпапками и фильтрами на папки и файлы. А тут даже интерес добавить вариант файлов исключений.

В конце концов по оформлению топика сразу видно, что человек хочет: получить готовое решение или он действительно зашел в тупик и ему нужна подсказка (всего лишь намек). А может он вообще ошибся форумом или заранее знает, что здесь есть добрый и замечательный proxy, который для всех готов писать программы по своей доброте душевной. Причем, даже можно точно не расписывать свою проблему, он ведь догадливый и сам все поймет. »
:)

Нужно людям помогать и давать думать, а не лишать их этого. »
я не мешаю другим форумчанам этим заниматься. Креатор мне в этом помогает - если я наглею с примерами :)

Но это лишь мое личное мнение, без обид. »
...чему тут обижаться? )) Самое главное - ЗДОРОВ и БОДР!! ))


[off]вЭто относится к 2-у способу _FileListToArray() »
угу, просмотрел, понял

Yashied
14-07-2009, 00:44
proxy, кстати, только сейчас заметил, у тебя отличная сигнатура, особенно вторая строчка. :wink:

semiono
14-07-2009, 12:30
А вдруг человек сам хочет додуматься »
Не не хочу сам думать :)
Я сразу сказал нужна утилита. К сожалению завален делами, будет потом время подумаю, но иногда просто помощь нужна.

Этсамое. Забыл. У меня всегда потребность чтобы всё консольное! И как изначала, я тоже говорил, надоб ввод создать.
Типа - # ifind.exe --not= exe или # ifind.exe --not= txt
Как обычно консольные проги бывают... Ну и print это всё в консоль отчёт :)
Ох, я уж точно сам не потяну это добить. :\
ЗЫ это хорошо, чтобы потом для всех, как win32 утиль, потомушта я тоже альтурист ))

amel27
14-07-2009, 15:56
завален делами, будет потом время подумаю, но иногда просто помощь нужна.
Этсамое. Забыл. У меня всегда потребность чтобы всё консольное »батником быстрей (как в написании, так и в выполнении) ....хотя, если "альтруист", тогда ладно :)

semiono
14-07-2009, 18:42
у меня было желание и батник спросить, хотя не знаю, а что разве есть способ? :)
хотя то что я видел в разделе по батникам меня весьма удивляет! очень крута!

amel27
15-07-2009, 11:20
было желание и батник спросить »в соответствующую ветку




© OSzone.net 2001-2012