العثور على سمات أسماء الملفات الصينية باستخدام NewLisp؟

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

سؤال

يعرض لي رمز 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")

نصائح أخرى

منذ الإصدار 10.3.2 ، الذي تم تنفيذه في 20 يوليو 2011 ، 10.3.2 ، تتم معالجة MultiByTeToWidechar داخليًا من قبل NewLisp عند قراءة أسماء المسار/الملفات.

ربما لا تستخدم إصدار Unicode من NewLisp. أي حالة ، هناك عدد قليل جدا من newlispers هنا. محاولة منتدى NewLisp في حين أن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top