Trovare gli attributi di nomi di file cinesi che utilizzano newLISP?
-
28-09-2019 - |
Domanda
I seguenti spettacoli codice newLISP me gli attributi di file di file in Win32. Tuttavia, alcuni dei nomi dei file recuperati hanno caratteri cinesi nel nome. Quando la funzione GetFileAttributesA li incontra, mi -1 dà per l'attributo. Ho guardato GetFileAttributesW, ma non so come fare il contenuto del fname a disposizione la funzione in una forma riconosce.
Come si fa a gestire questa situazione? (Io sono disposto a prendere in considerazione cercando un'altra lingua)
(define (get-archive-flag file-name)
(if (not GetFileAttributesA)
(begin
(import "kernel32.DLL" "GetFileAttributesA")
)
)
(setq fname file-name file-attrib (GetFileAttributesA (address fname)))
(append fname " " ( string file-attrib))
)
; walks a disk directory and prints all path-file names
;
(define (show-tree dir)
(if (directory dir)
(dolist (nde (directory dir))
(if (and (directory? (append dir "/" nde))
(!= nde ".") (!= nde ".."))
(show-tree (append dir "/" nde))
(println (get-archive-flag (append dir "/" nde)))
)
)
)
)
(show-tree "z:\\working files\\Cathy")
Soluzione 3
Per ragioni di completezza, ecco la soluzione, che si trova in consultazione con la gente sul newLISP forum .
Non ho sostituito la tecnica bits slice reverse
sul bit attributo con l'operatore &
più appropriato. Quello che resta per il lettore.
(constant 'SIZEOF_WCHAR 2) ; assumption
(constant 'CP_UTF8 65001)
(define (utf8->16 lpMultiByteStr , cchWideChar lpWideCharStr ret)
(if (not MultiByteToWideChar)
(begin
(import "kernel32.DLL" "MultiByteToWideChar")
)
)
; calculate the size of buffer (in WCHAR's)
(setq cchWideChar
(
MultiByteToWideChar
CP_UTF8 ; from UTF-8
0 ; no flags necessary
lpMultiByteStr
-1 ; convert until NULL is encountered
0
0
)
)
; allocate the buffer
(setq lpWideCharStr (dup " " (* cchWideChar SIZEOF_WCHAR)))
; convert
(setq ret
(
MultiByteToWideChar
CP_UTF8 ; from UTF-8
0 ; no flags necessary
lpMultiByteStr
-1 ; convert until NULL is encountered
lpWideCharStr
cchWideChar
)
)
(if (> ret 0) lpWideCharStr nil)
)
; resets the Win32 archive flag on a file
; By CaveGuy 2009
(define (get-archive-flag file-name)
(if (not GetFileAttributesW)
(begin
(import "kernel32.DLL" "GetFileAttributesW")
)
)
(setq fname file-name
file-attrib (GetFileAttributesW (utf8->16 fname))
)
file-attrib
)
; walks a disk directory and prints all path-file names where archive bit is set
;
(define (show-tree dir)
(if (directory dir)
(dolist (nde (directory dir))
(if (and (directory? (append dir "/" nde)) (!= nde ".") (!= nde "..") )
(show-tree (append dir "/" nde))
(if (not (or (= nde ".") (= nde "..")))
(begin
(setq fname (append dir "/" nde))
(setq fflag (get-archive-flag fname))
(setq fbits (bits fflag))
(if (= (slice (reverse fbits) 5 1) "1") (println fname))
)
)
)
)
)
)
(show-tree "//server/folder")
Altri suggerimenti
A partire dalla versione 10.3.2, relased 20 Luglio 2011, 10.3.2, MultiByteToWideChar viene gestita internamente dal newLISP durante la lettura i nomi di percorso / file.
Forse non utilizzare la versione Unicode di newLISP. Anycase, ci sono pochissimi Newlispers qui. Prova newLISP forum .