Найти атрибуты китайских файлов, использующих newlisp?

StackOverflow https://stackoverflow.com/questions/3083240

Вопрос

Следующий код NewLisp показывает мне атрибуты файлов файлов под Win32. Тем не менее, некоторые из полученных имени имени имеют китайские символы на имя. Когда функция GetFileattributeSA встречает их, это дает мне -1 для атрибута. Я посмотрел на GetFileAttributew, но не знаю, как сделать содержимое FNAME доступного функции в форме, которую он распознает.

Как можно справиться с этой ситуацией? (Я готов рассмотреть возможность попробовать другой язык)

(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")
Это было полезно?

Решение 3

Ради полноты, вот решение, найденное в консультации с народным Newlisp Forum..

Я не заменил bits slice reverse Техника на атрибут бит с более подходящим & оператор. Это осталось для читателя.

(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")

Другие советы

С версии 10.3.2, отброшенные 20 июля 2011 года, 10.3.2, MultiBytetoWideChar взаимосвязан внутри NewLisp при чтении имен / файлов.

Может быть, вы не используете Unicode версию NewLisp. Здесь keycase, здесь очень мало новобранцев. Пытаться Newlisp Forum. вместо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top