如何在vba中用GetShortPathName获取文件的8.3文件名?

所有文件系统的文件命名规则都是”文件的基础名称+.+扩展名”。

比如文件名test.xls、abc.txt等。

在MS-DOS FAT文件系统中,支持一种最多8个字符的文件基础名称+.+3个字符的扩展名的文件名命名规则,简称为8.3文件名。

为了区别8.3文件名,任何长度大于8.3的文件名被称为long file name,对应的8.3文件名称为short file name。

虽然现在的文件系统都已经不再只能容纳这么短的文件名了,但是为了向前兼容,当我们创建了一个长的文件名时,系统会自动的创建一个8.3文件名作为别名。

为了获得一个文件的8.3文件名可以使用API函数GetShortPathName 它的语法如下:

DWORD WINAPI GetShortPathName(
  _In_  LPCTSTR lpszLongPath,
  _Out_ LPTSTR  lpszShortPath,
  _In_  DWORD   cchBuffer
);

其中参数lpszLongPath指的是要转换的文件名,lpszShortPath参数指的是接受转换后的文件名,cchBuffer为缓冲区的大小(字符数)。

如果参数lpszShortPath设置为null,cchBuffer参数设置为0,则GetShortPathName函数的返回值为这个转换实际需要的的缓冲区大小(字符数)。

根据以上的知识,可以使用如下的代码获取文件的8.3文件名。

Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Sub QQ1722187970()
    Dim sPath As String
    '要转换的文件名
    sFileName = Excel.ThisWorkbook.FullName
    Debug.Print sFileName
    '转换后的文件名(8.3文件命名规则)
    Dim str1 As String
    Dim lLen As Long
    '先获取缓冲区大小(字符数)
    lLen = GetShortPathName(sFileName, vbNullString, 0)
    '按照获取的大小先填充缓冲区
    str1 = Space(lLen)
    '再次调用填充实际的转换后的文件名
    GetShortPathName sFileName, str1, lLen
    '立即窗户输出结果
    Debug.Print str1
End Sub

 

       

发表评论