NewLispを使用して中国のファイル名の属性を見つける?
-
28-09-2019 - |
質問
次の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
完全性のために、ここに解決策があります。 Newlispフォーラム.
私は置き換えていません 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")
他のヒント
2011年7月20日、10.3.2のバージョン10.3.2以来、MultiBytetowideCharは、パス/ファイル名を読むときにNewLispによって内部的に処理されます。
たぶん、あなたはnewlispのUnicodeバージョンを使用しないでしょう。 Anycase、ここにはNewLispersはほとんどありません。試す Newlispフォーラム 代わりは。
所属していません StackOverflow