Modify ↓
Opened 11 years ago
Closed 11 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
Attachments (0)
Change History (3)
comment:1 Changed 11 years ago by Jon
comment:2 Changed 11 years ago by Jon
Updated the documentation.
comment:3 Changed 11 years ago by Jon
- Milestone set to 3.3.11.0
- Owner set to Jon
- Resolution set to Fixed
- Status changed from new to closed
Fixed by revision [9455] in version: 3.3.11.0
Guidelines for posting comments:
- You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
- In-depth discussions should take place on the forum.
For more information see the full version of the ticket guidelines here.
Note: See
TracTickets for help on using
tickets.
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...