Что нового

FileFindNextFile находит то чего нет и не видит то что есть

zumers

Новичок
Сообщения
8
Репутация
0
Нижеприведенный код при поиске в папке system32 находит 13780 файлов, когда подсчет через проводник или TotalComander находит 16552, а в папке Users наоборот 20785 и 17706 соответственно :stars:
Код:
#include <Array.au3>
$sFileList = ""
__FO_FileSearchAll($sFileList, "D:\")
$sFileList = StringSplit($sFileList, @CRLF, 1)
_ArrayDisplay($sFileList, 'все файлы')
Func __FO_FileSearchAll(ByRef $sFileList, $sPath)
	Local $sFile, $s = FileFindFirstFile($sPath & '*')
	If $s = -1 Then Return
	While 1
		$sFile = FileFindNextFile($s)
		If @error Then ExitLoop
		If @extended Then
			__FO_FileSearchAll($sFileList, $sPath & $sFile & '\')
		Else
			$sFileList &= $sPath & $sFile & @CRLF
		EndIf
	WEnd
	FileClose($s)
EndFunc


Плюс к сказанному вижу в проводнике файл (могу скопировать, просмотреть свойства и т.д.) C:\Windows\System32\acmigration.dll, но при выполнении:
Код:
if FileExists("C:\Windows\System32\acmigration.dll") Then MsgBox(0, "","Нашел")

... тишина. Может кто пояснить в связи с чем так получается?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
у вас же винда 64 битная?


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

http://autoit-script.ru/index.php?topic=13419.msg85477 вот тема, почитай разберись.
 
Автор
Z

zumers

Новичок
Сообщения
8
Репутация
0
Извиняюсь, хотел указать, но вылетело из головы, да 64-х. Премного благодарен)
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Быстрый поиск файлов

Код:
Func _FileSearch($sPath, $sFileMask)
    Local $sOut, $aOut, $hDir

    $sOut = StringToBinary("0" & @CRLF, 2)
    $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
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Vovsla
Эта функция дает ошибочные результаты. Уже обсуждалось. Привлекать консольное приложение системы при наличии нативных функций- не самое лучшее решение
http://autoit-script.ru/index.php?topic=8266.15
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Странно, у меня с этой функцией проблем не было
Тогда есть другая функция

Код:
Func _FindFiles($sRoot, $sFile)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            $Text &= $sRoot & '\' & $FileList[$i] & @CRLF
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf
EndFunc   ;==>_FindFiles
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Vovsla
можно самому это сделать, без привлечения библиотеки. хотя в данной функции применяются нативные функции перечисления файлов
для своего проекта я сделал проще
Код:
#include <Array.au3>
Local $res = _FileSearch('C:\1')
_ArrayDisplay($res)
ConsoleWrite($res & @LF)
Func _FileSearch($sPath, $Param = 0)
	$sPath = $sPath & '\'
	Local $sFileList
	_FileSearchAll($sFileList, $sPath, $Param)
	$sFileList = StringStripWS(StringTrimRight($sFileList, 1), 3)
	If Not $sFileList Then Return -1
	Local $aFiles = StringSplit($sFileList, '|')
	Return $aFiles
EndFunc   ;==>_FileSearch

Func _FileSearchAll(ByRef $sFileList, $sPath, $Param = 0)
	Local $sFile, $FirstFile = FileFindFirstFile($sPath & '*')
	If $FirstFile = -1 Then Return
	While 1
		$sFile = FileFindNextFile($FirstFile)
		If @error Then ExitLoop
		If @extended Then
			If Not $Param Then _FileSearchAll($sFileList, $sPath & $sFile & '\', $Param)
		Else
			$sFileList &= $sPath & $sFile & '|'
			If $Param Then ExitLoop
		EndIf
	WEnd
	FileClose($FirstFile)
EndFunc   ;==>_FileSearchAll
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Ваша функция в 1.8 раза быстрее чем с использованием консоли и в 2.2 раза быстрее чем с использованием FileListToArray
Большое спасибо
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
joiner, подскажите пожалуйста, как в Вашей функции искать файлы по маске и как пользоваться параметром $Param
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
эта функция была скопирована из моего проекта как есть
вот измененный вариант. поиск всех файлов или , если указано расширение, то файлов с этим расширением.все остальное можно доделать по типу
Код:
#include <Array.au3>

Local $res = _FileSearch('C:\Program Files','exe')
_ArrayDisplay($res)
ConsoleWrite($res & @LF)
Func _FileSearch($sPath, $ext = 0)
	$sPath = $sPath & '\'
	Local $sFileList
	_FileSearchAll($sFileList, $sPath, $ext)
	$sFileList = StringStripWS(StringTrimRight($sFileList, 1), 3)
	If Not $sFileList Then Return -1
	Local $aFiles = StringSplit($sFileList, '|')
	Return $aFiles
EndFunc   ;==>_FileSearch

Func _FileSearchAll(ByRef $sFileList, $sPath, $ext = 0)
	Local $sFile, $FirstFile = FileFindFirstFile($sPath & '*'), $getext
	If $FirstFile = -1 Then Return
	While 1
		$sFile = FileFindNextFile($FirstFile)
		If @error Then ExitLoop
		If @extended Then
			_FileSearchAll($sFileList, $sPath & $sFile & '\', $ext)
		Else
			If $ext Then
				$getext = StringRegExpReplace($sFile, '^.*\.', '')
				If Not StringCompare($ext, $getext) Then $sFileList &= $sPath & $sFile & '|'
			Else
				$sFileList &= $sPath & $sFile & '|'
			EndIf
		EndIf
	WEnd
	FileClose($FirstFile)
EndFunc   ;==>_FileSearchAll
есть библиотека FileOperations.au3
по типу ее функций можно сделать свою
нужно помнить, что каждая проверка отнимает время. поэтому стоит для каждого проекта упрощать функции. мое мнение
 
Верх