windows - 获取 Dos (8.3) 文件名

标签 windows go short-filenames

我有一个目录,其中的文件名包含“有趣”的字符。我想获取文件的 DOS (8.3) 文件名。我怎样才能做到这一点?我选择的语言是 Go。

C:\...\foo>dir /x
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: 329F-C2FE

 Verzeichnis von C:\...\foo

29.09.2018  16:22    <DIR>                       .
29.09.2018  16:22    <DIR>                       ..
23.07.2009  01:52             5.526 CW9463~1.PDF cöw.pdf
               1 Datei(en),      1.922.706 Bytes
               0 Verzeichnis(se), 48.235.646.976 Bytes frei

我想获取 CW9463~1.PDF 文件名而不是 cöw.pdf

(我将使用这个文件名打开一个文件进行阅读。)

最佳答案

我找到了一个解决方案,但它并没有真正帮助我。 (请参阅@eryksun 的评论/警告)

import (
    "golang.org/x/sys/windows"
)

func GetShortPathName(name string) (path string, err error) {
    lp, err := windows.UTF16PtrFromString(name)
    if err != nil {
        return "", err
    }
    n := uint32(100)

    for {
        buf := make([]uint16, n)
        n, err = windows.GetShortPathName(lp, &buf[0], uint32(len(buf)))
        if err != nil {
            return "", err
        }
        if n <= uint32(len(buf)) {
            return windows.UTF16ToString(buf[:n]), nil
        }
    }
}

关于windows - 获取 Dos (8.3) 文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52569369/

相关文章:

ruby - 如何在 Windows 上的 Ruby 中获取文件创建时间?

c++ - 获取单击鼠标按钮的窗口句柄

go - OpenShift API - 无法使用配置

goroutines 死锁,需要一些解释

windows - 在长模式下复制短 8.3 文件名 (Windows)

OS X 上的 Git 'filename too long' 错误

c - Windows 中 IP_RECVOPTS 和 IP_RECVRETOPTS 的等效项是什么

c++ - Qt Widget应用程序 "Library not registered"错误

go - 返回对象中的所有内容

windows - 使用 8 个字母的过程有什么好处?