首页 > 解决方案 > VBA DIR 函数返回不在目录中的文件

问题描述

我有一个 EXCEL VBA 'export to 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
  1. DIR函数返回长度大于0的文件名
  2. msgbox 显示一个路径。(但目录中没有文件。搜索 windows 会在不同的目录中找到该文件。)
  3. “文件复制”代码是将文件复制到临时目录
  4. “文件打开”代码启动,但报告找不到文件

背景:我们有内置在 excel 中的工程日志,它使用 VBA 应用程序导出为 pdf 和电子邮件。看起来代码源自 MSDN,可能是为 Office 2007 构建的。最近 WIN 10 Office 16 计算机进行了 Windows 更新,但代码现在失败了。我通过注释掉 EXP_PDF.dll 的搜索来恢复功能,但我想知道为什么 DIR 功能似乎在其他位置找到 dll,是的,隐藏文件和 windows 文件设置为显示。谢谢。

标签: excelvbaactive-directorydirectory

解决方案


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".

VBA 似乎正在使用虚拟文件系统(注意 ..\vfs)。

EXp_PDF.DLL 目录

虚拟文件系统允许应用程序有效地合并多个目录。
这样,当您引用一个目录时,您将引用合并中的所有目录。这使得应用程序无论安装在哪里都可以无缝运行。

我相信这个文件系统实际上存在于内部。从 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 个文件。

在此处输入图像描述

获取文件夹中所有文件的文件名


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());
      }
    }

推荐阅读