Mira las imágenes del programa y de la ruta de los 3 archivos.
Estos nombre son estos:
Výstřižek1.JPG
Výstřižek3.JPG
Výstřižek4l.JPG
Y nombres chinos si los acepta, no lo entiendo.
Esa r, definitivamente es un carácter checo...
Tienen solución, básicamente es la misma presentada... solicitar el 'shortname' del fichero, esto es, los antiguos nombres MS-DOS: "8.3"
Piensa que el modo de solventar problemas con caracteres es dejarlos aparte en lo posible y hacer referencia ello con algo ajeno a los caracteres explícitos, por ejemplo: un handle (una dirección de memoria), un índice en un array... así el contenido de dicho string, puede ser lo que sea, mientras no se 'toque' no hay conversión (errónea por truncamiento), que luego falle su referencia en una búsqueda posterior. Aún así he crerado una función que analiza los caracteres aún siendo disitntos en origen... es complicado explicar por qué funciona sin tener una base profunda del fundamento de los caracteres, codificación, la plataforma y el lenguaje de programación usado... de hecho mucha gente habrá tratado múltiples ideas y modificaciones sin resultados.
...pero como digo tiene solución, el caso previo se puede alojar en el nuevo sin distinción de cual de ellos se da, son pocas líneas más de código, sin embargo como dices que tienes varios miles de imágenes en la carpeta, no es muy eficiente que cada vez que se localice un fichero con un nombre así, deba recorrerse todo un array para tomar su shortname (el 8.3). Esto exige 3 cosas...
La primera repensarlo todo y rehacer una especie de 'fileCommonDialog' que al leer el contenido de una carpeta, tome el array de dichos ficheros, así luego puede referenciarse el mismo por su índice en el array...
La segunda cuestión es que dado que esos nombres 'raros', ralentizan innecesariamente su procesado una y otra vez, lo ideal es que cada vez que localice uno, lo renombre ... si lleva caracteres del 'primer tipo', eliminandolos, si lleva caracteres Unicode 'del segundo tipo', truncarlos, lógicamente antes de ese renombrado se debería comprobar si el nombre a asignar existe ya o no, para decidir otro si ese está ocupado y que no falle el renombrado. Y por supuesto dicho renombrado sería un parámetro opcional. Aunque pueda parecer no necesario, ese renombrado posibilitaría que otros programas que tuvieren problemas con tales ficheros en tu equipo quedara resuelto (hacelro manulamente cuando son muchos es tedioso, claro). Y también habría que considerar que no todos los ficheros deben ser renombrables, los de librerías y aplicaciones podrían inutilizar la aplicación de la que son parte, por lo que debería limitarse a los 'documentos de usuarios' y eso cada uno sabe cuales son conforme a las carpetas que los mantiene en su equipo.
En fin crear un fileCommonDialog, son algo más que 4 líneas, y se sale un poco del tiempo que uno puede dedicar a ayudar a otros (otra cosa es cuando ya tienes uno montado de tiempo atrás)...
Si no te basta con la solución que te aporto a continación, pués con dicho código y el resto demis comentarios, tú mismo podrías montarte un FileCommonDialog para la ocasión... la clave para lograr todo esto es recurrir a al objeto FileSystemObject... que hay que añadirlo al proyecto como una referencia:
Y ahora el código:
(nota que excepto la función del mismo nombre el resto es añadido (a lo que ya te dí), la función 'ResuelveRuta' remplaza a la existente)...
' previamente hay que añadir la referencia al proyecto de: FileSystemObject
Private fso As New FileSystemObject
Private fold As Folder
Private f As File
' 'primer' y 'segundo' tipo, es solo una connotación para la solución y el tiempo que lleva cada caso.
Private Function ResuelveRuta(ByVal Ruta As String, Optional ByRef SegundoIntento As Boolean) As String
Dim k As Integer, j As Integer, fichero As String
If Existe(Ruta) Then
k = InStrRev(Ruta, "\")
If (Left$(WFD.cAlternate, 1) <> Chr(0)) Then
' Aqui CAZA: caracteres Unicode (del primer tipo) en el nombre del fichero.
j = InStr(WFD.cAlternate, Chr(0)) ' este campo tiene 14 caracteres, en nombres muy cortos, tipo 3.jpg, todavía podría haber caracteres null al final del mismo.
If (j > 0) Then
ResuelveRuta = Left$(Ruta, k) & Left$(WFD.cAlternate, j - 1)
Else
ResuelveRuta = Left$(Ruta, k) & WFD.cAlternate
End If
Else
ResuelveRuta = Ruta ' Left$(Ruta, k) & WFD.cFileName
End If
Else
If (SegundoIntento = False) Then
SegundoIntento = True
k = InStrRev(Ruta, "\")
j = Len(Ruta)
If (k < j) Then
' Aqui CAZA: caracteres Unicode (del segundo tipo) en el nombre del fichero.
fichero = Right$(Ruta, j - k)
Set fold = fso.GetFolder(Left$(Ruta, k))
For Each f In fold.Files
If (StrCompUnicode(f.Name, (fichero)) = True) Then
ResuelveRuta = ResuelveRuta(Left$(Ruta, k) & f.ShortName)
' usar f.ShortPath si además de los ficheros, las carpetas también tuvieran 'caracteres raros'...
SegundoIntento = False
Exit Function
End If
Next
ResuelveRuta = ""
Else
ResuelveRuta = ""
End If
SegundoIntento = False
Else
ResuelveRuta = ""
End If
End If
End Function
Private Function Existe(ByVal Ruta As String) As Boolean
Existe = (FindFirstFile(Ruta, WFD) <> INVALID_HANDLE_VALUE)
End Function
' Hace una comparación binaria de los bytes pares
' OJO: No modificar un ápice esta función, basta retirar los 'ASC()' para que falle, lo mismo si se hace una conversión a arrays...
' ejemplos que fallan:
' StrCompUnicode = (Str1 = Str2) Then
' StrCompUnicode = Strcom(str1, str2, vbTextCompare) ó vbBinaryCompare
' If (Mid$(Str1, k, 1)) <> (Mid$(Str2, k, 1))) Then Exit Function
Private Function StrCompUnicode(ByRef Str1 As String, ByRef Str2 As String) As Boolean
Dim k As Long, j As Long
k = Len(Str1): j = Len(Str2)
If (k = j) Then
For k = 1 To j
'Debug.Print CStr(Asc(Mid$(Str1, k, 1))),
'Debug.Print CStr(Asc(Mid$(Str2, k, 1)))
If (Asc(Mid$(Str1, k, 1)) <> Asc(Mid$(Str2, k, 1))) Then Exit Function
Next
StrCompUnicode = True
End If
End Function
...puedes tirar con esto, o basarte en esto y mis comentarios previos para montarte tú mismo un FileCommonDialog, que use precisamente el FilesystemObject como el eje de la solución... de todos modos aún con miles de ficheros en una carpeta, con la potencia d elos equipos de hoy, no debería notarse lentitud apreciable en el tratamiento, aunque claramente ese bucle es preferible que se hicera una única vez (cuando se accede a la carpeta y no con cada fichero que tenga caracteres Unicode del 'segundo tipo'...