代码之家  ›  专栏  ›  技术社区  ›  bugmagnet

使用NewLISP查找中文文件名的属性?

  •  1
  • bugmagnet  · 技术社区  · 14 年前

    下面的NewLISP代码显示了Win32下文件的文件属性。但是,检索到的一些文件名的名称中有中文字符。当GetFileAttributesA函数遇到它们时,它会为属性提供-1。我查看了GetFileAttributesW,但不知道如何使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 回复  |  直到 14 年前
        1
  •  2
  •   Lutz    13 年前

    自版本10.3.2(2011年7月20日发布)10.3.2以来,当读取路径/文件名时,newLISP在内部处理MultiByteToWideChar。

        2
  •  1
  •   N-L    14 年前

    可能您没有使用Newlisp的Unicode版本。不管怎样,这里很少有新词。尝试 Newlisp forum 相反。

        3
  •  1
  •   bugmagnet    14 年前

    为了完整起见,这里有一个解决方案,是在与民间协商的基础上找到的 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")
    
    推荐文章