我有一个EXCEL VBA'导出到PDF'应用程序,它使用DIR来验证EXP_PDF.dll文件是否存在。该函数返回文件,但该文件实际上位于与DIR路径指向的目录不同的目录中。我构建了以下简单的子测试:
Sub RetrieveFile()
Dim Shex As Object
Set Shex = CreateObject("Shell.Application")
file = Dir(Environ("commonprogramfiles") & "\Microsoft Shared\OFFICE" & Format(Val(Application.Version), "00") & "\EXp_PDF.DLL")
Path = Environ("commonprogramfiles") & "\Microsoft Shared\OFFICE" & Format(Val(Application.Version), "00")
targetFile = Path & "\EXp_PDF.DLL"
If Len(file) > 0 Then
MsgBox (targetFile & " Exists")
Debug.Print targetFile
FileCopy targetFile, "C:\Temp\exp_pdf.dll"
tgtfile = targetFile
Shex.Open (tgtfile)
Else
MsgBox ("File Doesn't Exist")
End If
End Sub
背景:我们有excel内置的工程日志,它使用VBA应用程序导出为pdf和电子邮件。看起来代码起源于MSDN,可能是为Office 2007而构建的。最近WIN 10 Office 16计算机进行了Windows更新,现在代码失败了。我通过注释掉EXP_PDF.dll的搜索来恢复功能,但我想知道为什么DIR功能似乎在其他位置找到了dll并且是隐藏的并且windows文件被设置为显示。感谢。
答案 0 :(得分:2)
EXp_PDF.DLL
实际上位于"C:\program files (x86)\Microsoft Office\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE16"
。此目录中有95个文件,"C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16"
中有1个文件。
VBA似乎正在使用虚拟文件系统(注意.. \ vfs)。
虚拟文件系统允许应用程序有效地合并多个目录 这样,当您引用一个目录时,您将引用合并中的所有目录。这使得Application无论在何处安装都可以无缝运行。
我相信这个文件系统实际上是在内部存在的。从Office产品运行下面的Msgbox返回96,VBScript返回1.
MsgBox CreateObject(“Scripting.FileSystemObject”)。GetFolder(“C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ OFFICE16”)。Files.Count
public static void main(String[] args) throws IOException {
File folder = new File("C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE16");
Java还列出了1个文件。
Getting the filenames of all files in a folder
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
System.out.println("File " + listOfFiles[i].getName());
} else if (listOfFiles[i].isDirectory()) {
System.out.println("Directory " + listOfFiles[i].getName());
}
}