Das Finden der Attribute der chinesischen Dateinamen mit newLISP?
-
28-09-2019 - |
Frage
Die folgenden newLISP Code zeigt mir die Datei von Dateien unter Win32-Attributen. Allerdings abgerufen einige der Dateinamen chinesische Zeichen im Namen haben. Wenn die GetFileAttributesA Funktion auf sie trifft, gibt es mir ein -1 für das Attribut. Ich sah GetFileAttributesW aber nicht wissen, wie der Inhalt des fname auf die Funktion in einer Form zur Verfügung stellen erkennt.
Wie geht man diese Situation? (Ich bin bereit, eine andere Sprache zu prüfen, versuchen)
(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")
Lösung 3
Aus Gründen der Vollständigkeit, hier ist die Lösung, in Absprache mit dem Folk auf dem newLISP Forum .
Ich habe nicht ersetzt die bits slice reverse
Technik auf dem Attribut-Bit mit dem geeignetere &
Operator. Das ist links für den Leser.
(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")
Andere Tipps
Seit der Version 10.3.2, relased 20. Juli 2011, 10.3.2 wird MultiByteToWideChar intern von newLISP behandelt, wenn Pfad / Dateinamen zu lesen.
Vielleicht verwenden Sie keine Unicode-Version von newLISP. Anycase, gibt es sehr wenige Newlispers hier. Versuchen Sie newLISP Forum statt.