2015-11-13 76 views
7

Jestem iteruje poprzez pliki w folderze (co oznacza, że ​​nie znam nazwisk w folderze) i mam plik z polską ł znak.Praca z nazwami plików w Unicode w VBA (przy użyciu Dir, FileSystemObject itp.)

Funkcja Dir przekształca to w l, co oznacza, że ​​nazwy pliku nie można znaleźć w późniejszym terminie. Deklarowałem var, że przypisuję wartość dir jako ciąg znaków.

Próbowałem również FSO i getfolder, który ma również ten sam problem.

Zauważyłem również, że okno dialogowe plików (ustawione na tryb wyboru folderu) konwertuje powyższy znak.


Czy to błąd, czy jest to coś, nad czym można pracować?

+0

mnie źle, ja rzeczywiście zrobił to w pośpiechu, ale to nie było aby wskazać, że był to duplikat, miał wskazać możliwy kąt pracy, ale po bliższym przyjrzeniu się nie będzie dotyczył twojego problemu. Pozwól mi przyjrzeć się bliżej. Czy możesz opublikować swój kod? Albo w jaki sposób "przyciemniłeś" zmienną, której używasz do 'Dir'? Czy próbowałeś także * Files Scripting Object *? – R3uK

+0

Ten link http://www.vbforums.com/showthread.php?555086-RESOLVED-Unicode-file-names & highlight = FindNextFileW/# 4 ... nie wydaje się interesujące, ale jest to VB, a nie tylko VBA. Istnieje również metoda konwersji specjalnego znaku, ale będzie działać tylko dla postaci, dla której wykonałeś transkodyfikację. W każdym razie wygląda na to, że FSO (Object Scripting Object) nie ma tego samego ograniczenia niż 'Dir', więc osobiście tak bym poszedł, jeśli nie jest to skomplikowane do zaimplementowania w kodzie! – R3uK

+0

Cholera ... FSO ma taki sam problem ... Czy próbowałeś zadeklarować swoją wartość Dir jako Wariant? (dzikie przypuszczenie, ale w tym momencie wydaje mi się (przynajmniej dla mnie), że istnieje tylko VB lub Transcodification ...). Oto linki do transco/convert: http://www.pcreview.co.uk/threads/workaround-for-chdir-curdir-when-path-has-unicode-characters.3155241/#post-10639076 i http: //www.vbforums.com/showthread.php?596307-How-to-check-if-a-file-folder-with-unicode-filename-extists-getting-its-attributes&p=3683899&viewfull=1#post3683899 – R3uK

Odpowiedz

3

Brzmi jak ty są wprowadzani w błąd przez fakt, że podczas VBA sama obsługuje znaków Unicode, VBA środowisko programistyczne nie. Edytor VBA nadal wykorzystuje stare kodowanie znaków "strona kodowa" w oparciu o ustawienia regionalne w systemie Windows.

Z pewnością FileSystemObjectet. glin. w rzeczywistości obsługują znaki Unicode w nazwach plików, co ilustruje poniższy przykład. Z folderu zawierającego trzy pliki tekstowe

Nazwa pliku: 1_English.txt
Zawartość: London is a city in England.

Nazwa pliku: 2_French.txt
treści: Paris is a city in France.

Nazwa pliku: 3_Połish.txt
treści: Warsaw is a city in Poland.

Poniższy Kod VBA ...

Option Compare Database 
Option Explicit 

Sub scanFiles() 
    Dim fso As New FileSystemObject, fldr As Folder, f As File 
    Set fldr = fso.GetFolder("C:\__tmp\so33685990\files") 
    For Each f In fldr.Files 
     Debug.Print f.Path 
    Next 
    Set f = Nothing 
    Set fldr = Nothing 
    Set fso = Nothing 
End Sub 

... daje następujący wynik w oknie Immediate ...

C:\__tmp\so33685990\files\1_English.txt 
C:\__tmp\so33685990\files\2_French.txt 
C:\__tmp\so33685990\files\3_Polish.txt 

Należy pamiętać, że oświadczenie Debug.Print przekształca charakter ł do l ponieważ środowisko programistyczne VBA nie może wyświetlić ł używając mojego systemu Windows locale (angielski amerykański).

Jednakże, poniższy kod nie otworzyć wszystkie trzy pliki z powodzeniem ...

Option Compare Database 
Option Explicit 

Sub scanFiles() 
    Dim fso As New FileSystemObject, fldr As Folder, f As File, ts As TextStream 
    Set fldr = fso.GetFolder("C:\__tmp\so33685990\files") 
    For Each f In fldr.Files 
     Set ts = fso.OpenTextFile(f.Path) 
     Debug.Print ts.ReadAll 
     ts.Close 
     Set ts = Nothing 
    Next 
    Set f = Nothing 
    Set fldr = Nothing 
    Set fso = Nothing 
End Sub 

... wyświetlanie

London is a city in England. 
Paris is a city in France. 
Warsaw is a city in Poland. 
+0

@ user3791372 - Kiedy I 'Debug.Print f.Size' w pętli otrzymuję prawidłowe (niezerowe) wartości. Nie jestem pewien, co masz na myśli przez "LOF", więc może robisz coś zupełnie innego. –

+0

@ user3791372 - Czy 'f.Size' zwraca zero dla wszystkich plików lub tylko dla tych z" zabawnymi znakami "w ich nazwach? –

+0

Być może ukryty plik? –