Что нового

[Баг] FileFindNextFile находит файлы не совпадающие по маске

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
FileFindNextFile находит файлы не совпадающие по маске при наличии русских символов в имени файла

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

$path = 'F:\' ;папка в которой создаются и ищутся файлы

$files = StringSplit("file.txt|file1.txt|file2.txt|prefix_file.txt|йfile.txt|начало file.txt|начало_file.txt|йfilйe.tйxt", "|")
FileChangeDir($path)
For $i = 1 To UBound($files) - 1
	_FileCreate($files[$i])
Next

$FileList1 = _FileListToArr($path, 'file*.txt')
_ArrayDisplay($FileList1, 'Find Files')

For $i = 1 To UBound($files) - 1
	FileDelete($files[$i])
Next

Func _FileListToArr($sPath, $sFilter = "*")
	Local $hSearch, $sFile, $sFileList, $sDelim = "|"
	$hSearch = FileFindFirstFile($sPath & $sFilter)
	ConsoleWrite($sPath & $sFilter & @LF)
	If @error Then Return SetError(1, 1, "")
	While 1
		$sFile = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		$sFileList &= $sDelim & $sFile
		ConsoleWrite($sFile & @LF)
	WEnd
	FileClose($hSearch)
	If Not $sFileList Then Return SetError(1, 1, "")
	Return StringSplit(StringTrimLeft($sFileList, 1), "|")
EndFunc   ;==>_FileListToArr
 

amel27

Продвинутый
Сообщения
146
Репутация
55
это не баг AutoIT, а фича Windows
например, тут: http://forum.oszone.net/showthread.php?p=1415298
 
Автор
D

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
Всё же необходимо это учитывать и после поиска самому проверять соответствуют ли файлы маске. Возможно уже есть готовое решение?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Dreadfulangel сказал(а):
Возможно уже есть готовое решение?
Вот таже функция _FileListToArray(), но с небольшими изменениями. Помимо решения вышеописанной проблемы, здесь вы можете задавать еще и составную маску, например "*.jpe;*.jpeg;*.jpg".

Код:
Func _FileListToArrayEx($sPath, $sFilter = "*", $iFlag = 0)
	Local $hSearch, $aResult, $sFile, $sFileList, $sDelim = "|"
	$sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\"
	If Not FileExists($sPath) Then Return SetError(1, 1, "")
	If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
	If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
	$hSearch = FileFindFirstFile($sPath & '*')
	If @error Then Return SetError(4, 4, "")
	While 1
		$sFile = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		If ($iFlag + @extended = 2) Then ContinueLoop
		$aResult = DllCall('shlwapi.dll', 'int', 'PathMatchSpecW', 'wstr', $sFile, 'wstr', $sFilter)
		If (Not @error) And ($aResult[0]) Then $sFileList &= $sDelim & $sFile
	WEnd
	FileClose($hSearch)
	If Not $sFileList Then Return SetError(4, 4, "")
	Return StringSplit(StringTrimLeft($sFileList, 1), "|")
EndFunc   ;==>_FileListToArrayEx
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied,
Если поменять в Вашей функции
Код:
;...
If (Not @error) And ($aResult[0]) Then $sFileList &= $sDelim & $sFile
;на
If (Not @error) And Not ($aResult[0]) Then $sFileList &= $sDelim & $sFile
;...
То вместо маски поиска можно будет задавать исключения из поиска?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Верх