Modify ↓
Opened 13 years ago
Closed 12 years ago
#2310 closed Bug (Rejected)
FileGetShortName result wrong for long filenames
| Reported by: | KaFu | Owned by: | |
|---|---|---|---|
| Milestone: | Component: | AutoIt | |
| Version: | 3.3.8.1 | Severity: | None |
| Keywords: | Cc: |
Description
The result returned by FileGetShortName seem wrong if the path is longer than 260 characters. Only a truncated result (273 characters) is returned, but @error = 0.
Here is a reproducer using WinApiEx.
#include <WinAPIEx.au3>
; REMOVE test files
$sDir_Source = "\\?\" & @ScriptDir & "\_Source"
If MsgBox(4, "", "Press YES to run test" & @CRLF & @CRLF & "Press NO to remove files from previous test") <> 6 Then
For $i = 51 To 1 Step -1
$sDir = $sDir_Source
For $y = 1 To $i
$sDir &= "\1234567890"
Next
ConsoleWrite($i & @TAB & $sDir & "\test.txt" & @CRLF)
ConsoleWrite("FD: " & _FileDeleteEx($sDir & "\test.txt") & @CRLF)
$iRes = _DirRemoveEx_Empty($sDir)
ConsoleWrite(_WinAPI_GetLastErrorMessage() & @CRLF)
ConsoleWrite("RD: " & FileExists($sDir) & @TAB & $iRes & @CRLF)
Next
DirRemove("\\?\" & @ScriptDir & "\_Source")
Exit
EndIf
; CREATE test files
DirCreate("\\?\" & @ScriptDir & "\_Source")
$sDir = $sDir_Source
For $i = 0 To 50
$sDir &= "\1234567890"
_WinAPI_CreateDirectory($sDir)
_Create_TestFile($sDir & "\")
Next
; PERFORM Test
$sDir = @ScriptDir & "\_Source\"
For $i = 0 To 50
$sDir &= "1234567890\"
$sFile = $sDir & 'test.txt'
ConsoleWrite($i & @TAB & StringLen(FileGetShortName("\\?\" & $sFile)) & @TAB & FileGetShortName("\\?\" & $sFile) & @tab & @error & @CRLF)
ConsoleWrite($i & @TAB & StringLen(_WinAPI_GetShortPathNameW("\\?\" & $sFile)) & @TAB & _WinAPI_GetShortPathNameW("\\?\" & $sFile) & @CRLF)
ConsoleWrite("========" & @CRLF)
Next
Func _Create_TestFile($sDir)
$sFile = $sDir & 'test.txt'
Local $nBytes
$sText = StringLen($sFile) & @CRLF & $sFile
$tBuffer = DllStructCreate("byte[" & StringLen($sText) & "]")
DllStructSetData($tBuffer, 1, $sText)
$hFile = _WinAPI_CreateFile($sFile, 1)
_WinAPI_WriteFile($hFile, DllStructGetPtr($tBuffer), StringLen($sText), $nBytes)
_WinAPI_CloseHandle($hFile)
EndFunc ;==>_Create_TestFile
Func _WinAPI_GetShortPathNameW($sPath)
Local $rc = DllCall("kernel32.dll", "int", "GetShortPathNameW", "wstr", $sPath, "wstr", "", "int", 32768)
Return $rc[2]
EndFunc ;==>_WinAPI_GetShortPathNameW
Func _DirRemoveEx_Empty($sPath)
Local $iRes = DllCall("kernel32.dll", "int", "RemoveDirectoryW", "wstr", $sPath)
Return $iRes[0]
EndFunc ;==>_DirRemoveEx_Empty
Func _FileDeleteEx($sFile)
Local $iRes = DllCall("kernel32.dll", "int", "DeleteFileW", "wstr", $sFile)
Return $iRes[0]
EndFunc ;==>_FileDeleteEx
Attachments (0)
Change History (2)
comment:1 Changed 13 years ago by Jpm
comment:2 Changed 12 years ago by Jon
- Resolution set to Rejected
- Status changed from new to closed
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.

the repro test can run only under 3.3.9.4 still true in the current next beta