|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Рекурсивный поиск файла |
|
[решено] Рекурсивный поиск файла
|
Новый участник Сообщения: 31 |
Профиль | Отправить PM | Цитировать
Поиск файла выполняется при помощи функции, и выполняется очень долго. Возможно ли реализовать поиск файла в каталогах и подкаталогах другим способом - более быстрым?
Func _FindFiles($sRoot, $sFile) Local $FileList $FileList = _FileListToArray($sRoot, $sFile, 1) If Not @error Then For $i = 1 To $FileList[0] $filename2 = StringMid($Filelist[$i],StringInStr($Filelist[$i],"\",0,-1)+ 1) MsgBox(64,"",$filename2) Next EndIf $FileList = _FileListToArray($sRoot, '*', 2) If Not @error Then For $i = 1 To $FileList[0] _FindFiles($sRoot & '\' & $FileList[$i], $sFile) Next EndIf EndFunf Func FileSearch($sPath, $sFileSrh) ;путь к каталогу и имя файла Local $sFile, $Search, $sRes = "" While 1 $Search = FileFindFirstFile($sPath & "\" & $sFileSrh) If @error Then Return "" While 1 $sFile = FileFindNextFile($Search) If @error Then ExitLoop $sFile = $sPath & "\" & $sFile If StringInStr(FileGetAttrib($sFile), "D") > 0 Then ContinueLoop $sRes = $sFile MsgBox(64,"",$sRes) WEnd FileClose($Search) $Search = FileFindFirstFile($sPath & "\*.*") If @error Then ExitLoop While 1 $sFile = FileFindNextFile($Search) If @error Then ExitLoop $sFile = $sPath & "\" & $sFile If StringInStr(FileGetAttrib($sFile), "D") = 0 Then ContinueLoop $sRes = FileSearch($sFile, $sFileSrh) If $sRes <> "" Then ExitLoop 2 WEnd ExitLoop WEnd FileClose($Search) Return $sRes EndFunc Можно ли организовать поиск файла через WinAPI? |
|
Отправлено: 10:37, 20-01-2010 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать К сожалению, такой способ не сработает, поскольку несмотря на то, что chcp выполнится, и кодовая страница сменится…
|
Отправлено: 19:51, 04-02-2010 | #31 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Iska:
|
|
------- Отправлено: 19:55, 04-02-2010 | #32 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать Iska,
Creat0R, Значит я был прав насчет Encoding_UDF. А то я расстроился, думал опять руки кривые. |
Отправлено: 20:09, 04-02-2010 | #33 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
Creat0R, если не сложно, приведите Ваш код, как Вы пробовали. |
|
Отправлено: 21:15, 04-02-2010 | #34 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Iska:
$sBat = _ '@echo off' & @CRLF & _ 'chcp 1251 > nul' & @CRLF & _ 'dir /b "' & @DesktopDir & '\*.txt"' $hFile = FileOpen("test_dir.bat", 2) FileWrite($hFile, $sBat) FileClose($hFile) $sSdOutRead = "" $iPid = Run(@DesktopDir & '\test_dir.bat', @DesktopDir, @SW_HIDE, 2) While 1 $sSdOutRead &= StdoutRead($iPid) If @error <> 0 Then ExitLoop WEnd ConsoleWrite($sSdOutRead & @CRLF) #include <Array.au3> $aReturn = _FileSearch(@DesktopDir, "*.txt") _ArrayDisplay($aReturn) Func _FileSearch($sPath, $sFileMask) Local $sBatContent, $sBatFile, $sTmpFile, $hFile, $sRet, $aRet $sBatFile = @TempDir & "\~FileSearch.bat" $sTmpFile = @TempDir & "\~FileSearch.tmp" $sBatContent = _ '@ECHO OFF' & @CRLF & _ 'CHCP 1251 > Nul' & @CRLF & _ 'Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH>"%Temp%\~FileSearch.tmp' $hFile = FileOpen($sBatFile, 2) FileWrite($hFile, $sBatContent) FileClose($hFile) RunWait($sBatFile, @TempDir, @SW_HIDE) $sRet = FileRead($sTmpFile) FileDelete($sBatFile) FileDelete($sTmpFile) $aRet = StringSplit(StringStripCR(StringStripWS($sRet, 3)), @LF) Return SetError(@error, 0, $aRet) EndFunc |
|
------- Отправлено: 23:55, 04-02-2010 | #35 |
Новый участник Сообщения: 18
|
Профиль | Отправить PM | Цитировать есть - ф-ция у Креатора,мне она очень понравилась.Но в чем проблема...
Func _FileSearch($sPath, $sMask="*") If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0) Local $hSearch, $sFindNext, $sFilePath, $iPathIsFolder, $i = 0, $sRet = -1 Local $sRegExpFilter = StringReplace(StringReplace(StringReplace($sMask, ".", "\."), "*", ".*"), "?", ".") Local $iMax_Ret_Paths = 10000 Local $aPathesArr[$iMax_Ret_Paths+1] = [1, $sPath] While $i < $aPathesArr[0] $i += 1 $hSearch = FileFindFirstFile($aPathesArr[$i] & "\*") If $hSearch = -1 Then ContinueLoop While 1 $sFindNext = FileFindNextFile($hSearch) If @error Then ExitLoop $sFilePath = $aPathesArr[$i] & "\" & $sFindNext $iPathIsFolder = StringInStr(FileGetAttrib($sFilePath & "\"), "D") If $iPathIsFolder Then If $aPathesArr[0] >= $iMax_Ret_Paths Then $iMax_Ret_Paths *= 2 ReDim $aPathesArr[$iMax_Ret_Paths+1] EndIf $aPathesArr[0] += 1 $aPathesArr[$aPathesArr[0]] = $sFilePath ElseIf StringRegExp($sFindNext, "(?i)\A" & $sRegExpFilter & "\z") Then $sRet = $sFilePath ExitLoop EndIf WEnd FileClose($hSearch) If $sRet <> -1 Then ExitLoop WEnd Return SetError(Number($sRet = -1), 0, $sRet) EndFunc для чего мне это : хочетса сделать архив,в котором будут все найдены файлы с полными путями. потому что пока вот что получилось... : FileCopy(_FileSearch("c:\","test.ini"),"c:\temp.ini") $OF = ("c:\temp.ini") _ZipAdd ("c:\temp.zip",$OF) FileDelete ($OF) но это не очень удачливо просто . может ктото , чтото посоветует..) ,kkkkkkkk |
Последний раз редактировалось Creat0R, 05-02-2010 в 12:01. Причина: Добавлен тег кода Отправлено: 03:14, 05-02-2010 | #36 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать 80971815772, в оригинале эта функция таки возвращала полный список:
#include <Array.au3> $aFiles = _FileSearch(@DesktopDir, "*.txt") _ArrayDisplay($aFiles) Func _FileSearch($sPath, $sMask="*") If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0) Local $hSearch, $sFindNext, $sFilePath, $iPathIsFolder, $i = 0, $sRet = "" Local $sRegExpFilter = StringReplace(StringReplace(StringReplace($sMask, ".", "\."), "*", ".*"), "?", ".") Local $iMax_Ret_Paths = 10000 Local $aPathesArr[$iMax_Ret_Paths+1] = [1, $sPath] While $i < $aPathesArr[0] $i += 1 $hSearch = FileFindFirstFile($aPathesArr[$i] & "\*") If $hSearch = -1 Then ContinueLoop While 1 $sFindNext = FileFindNextFile($hSearch) If @error Then ExitLoop $sFilePath = $aPathesArr[$i] & "\" & $sFindNext $iPathIsFolder = StringInStr(FileGetAttrib($sFilePath & "\"), "D") If $iPathIsFolder Then If $aPathesArr[0] >= $iMax_Ret_Paths Then $iMax_Ret_Paths *= 2 ReDim $aPathesArr[$iMax_Ret_Paths+1] EndIf $aPathesArr[0] += 1 $aPathesArr[$aPathesArr[0]] = $sFilePath ElseIf StringRegExp($sFindNext, "(?i)\A" & $sRegExpFilter & "\z") Then $sRet &= $sFilePath & @CRLF EndIf WEnd FileClose($hSearch) WEnd $sRet = StringSplit(StringStripWS($sRet, 3), @CRLF, 1) If @error Then Return SetError(1, 0, -1) Return $sRet EndFunc |
------- Отправлено: 12:09, 05-02-2010 | #37 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
#include <Array.au3> $aReturn = _FileSearch(@DesktopDir, "*.txt") _ArrayDisplay($aReturn) Func _FileSearch($sPath, $sFileMask) Local $sOut = StringToBinary("0"& @CRLF, 2), $aOut Local $hDir = Run(@ComSpec & ' /U/C DIR "'& $sPath &'\'& $sFileMask &'" /S/B/A-D', @SystemDir, @SW_HIDE, 6) While 1 $sOut &= StdoutRead($hDir, False, True) If @error Then ExitLoop Wend $aOut = StringRegExp(BinaryToString($sOut,2), "[^\r\n]+", 3) If @error Then Return SetError(1) $aOut[0] = UBound($aOut)-1 Return $aOut EndFunc |
|
Отправлено: 12:14, 05-02-2010 | #38 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 12:24, 05-02-2010 | #39 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать amel27,
Creat0R, Объясните, пожалуйста, про ключ /U . В справках ничего про него не нашел. |
Отправлено: 12:36, 05-02-2010 | #40 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Поиск файла на компьютере | sashadeg | AutoIt | 12 | 30-01-2010 18:40 | |
Разное - [решено] Поиск по типу файла | 7human7 | Microsoft Windows 7 | 2 | 25-11-2009 09:51 | |
Интерфейс - [решено] Быстрый поиск | TEMA5 | Microsoft Windows 7 | 7 | 07-10-2009 20:42 | |
CMD/BAT - [решено] Как скопировать имя файла из текстового файла в код батника и т.д. | Nun-Nun | Скриптовые языки администрирования Windows | 6 | 13-05-2009 13:28 | |
Разное - [решено] поиск файлов | zai | Microsoft Windows 2000/XP | 20 | 07-10-2007 14:18 |
|