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")
È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top