2010-06-21 4 views
1

다음 NewLISP 코드는 Win32에서 파일의 파일 특성을 보여줍니다. 그러나 검색된 일부 파일 이름에는 이름에 중국어 문자가 있습니다. GetFileAttributesA 함수가 그것들을 만났을 때, 속성에 -1을 준다. GetFileAttributesW를 살펴 보았지만 fname의 내용을 함수가 인식 할 수있는 형식으로 사용하는 방법을 모릅니다.NewLISP를 사용하여 중국어 파일 이름 속성 찾기?

이 상황을 어떻게 처리합니까? (다른 언어를 사용해 볼 의향이 있습니다)

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

답변

1

완전한 설명을 위해 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") 
1

아마도 유니 코드 버전의 Newlisp을 사용하지 않아도됩니다. Anycase에는 Newlispers가 거의 없습니다. 대신 Newlisp forum을 시도하십시오.

2

버전 10.3.2, relased 7 월 20 일 2011, 10.3.2 이후, MultiByteToWideChar는 newLISP에 의해 내부적으로 처리됩니다.

관련 문제