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