首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NewLISP查找中文文件名的属性?

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

Stack Overflow用户
提问于 2010-06-21 16:57:03
回答 3查看 228关注 0票数 1

下面的NewLISP代码显示了Win32下文件的文件属性。但是,检索到的某些文件名的名称中包含中文字符。当GetFileAttributesA函数遇到它们时,它会为该属性指定一个-1。我查看了fname,但不知道如何使GetFileAttributesW的内容以函数能够识别的形式提供给函数。

如何处理这种情况?(我愿意考虑尝试另一种语言)

代码语言:javascript
复制
(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")
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-07 11:53:46

为了完整起见,这里是在与NewLISP forum上的人员协商后找到的解决方案。

我还没有用更合适的&操作符替换属性位上的bits slice reverse技术。这就留给读者了。

代码语言:javascript
复制
(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
EN

Stack Overflow用户

发布于 2011-10-01 23:30:31

从2011年7月20日发布的10.3.2版本开始,在读取路径/文件名时,MultiByteToWideChar由newLISP内部处理。

票数 2
EN

Stack Overflow用户

发布于 2010-06-22 04:08:05

也许您没有使用Newlisp的Unicode版本。无论如何,这里的Newlisper很少。请尝试使用Newlisp forum

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3083240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档