所有文件系统的文件命名规则都是”文件的基础名称+.+扩展名”。
比如文件名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


发表评论