Modify

Opened 12 years ago

Closed 12 years ago

#2453 closed Bug (Fixed)

FileFindNextFile can find not-matching mask files if non-English letters presented in the file name

Reported by: anonymous Owned by: Jon
Milestone: 3.3.11.0 Component: AutoIt
Version: 3.3.8.1 Severity: None
Keywords: Cc:

Description

It seems windows bug/feature, but still...
it affect results of FileListToArray
To reproduce - run in Unicode:

#include <Array.au3>
#include "File.au3"

$path = 'd:\12345' ;folder with is used to create files

$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 = _FileListToArray($path, 'file*.txt')
_ArrayDisplay($FileList1, 'Find Files')

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

Alternative:

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

Link : http://autoit-script.ru/index.php/topic,4285.0.html

Attachments (0)

Change History (3)

comment:1 by Jon, 12 years ago

Interesting one. I read around and found that the WinAPI FindFirstFile functions actually search both the long and short versions of a filename. If you look at those test files you can see that the short file name versions do indeed match the filter.

0/12/2013 20:01 0 file.txt
0/12/2013 20:01 0 file1.txt
0/12/2013 20:01 0 file2.txt
0/12/2013 20:01 0 PREFIX~1.TXT prefix_file.txt
0/12/2013 20:01 0 FILE~1.TXT йfile.txt
0/12/2013 20:01 0 FILE~3.TXT йfilйe.tйxt
0/12/2013 20:01 0 FILE~2.TXT начало file.txt
0/12/2013 20:01 0 _FILE~1.TXT начало_file.txt

That's not really what I would have expected...

comment:2 by Jon, 12 years ago

Updated the documentation.

comment:3 by Jon, 12 years ago

Milestone: 3.3.11.0
Owner: set to Jon
Resolution: Fixed
Status: newclosed

Fixed by revision [9455] in version: 3.3.11.0

Modify Ticket

Action
as closed The owner will remain Jon.

Add Comment


E-mail address and name can be saved in the Preferences .
 
Note: See TracTickets for help on using tickets.