【问题标题】:MS-Access nested DIR - check if a file exists elsewhere whilst looping through a folderMS-Access 嵌套 DIR - 检查文件是否存在于其他地方,同时遍历文件夹
【发布时间】:2011-02-14 01:01:48
【问题描述】:

我在 Microsoft Access 2003 中使用了 DIR() 命令来遍历文件夹 A 中的文件。这工作正常,但我需要检查每个文件是否也存在于另一个位置(文件夹 B),并且只处理如果文件夹 B 中不存在该文件。

问题是检查文件夹 B 中存在的文件也使用 DIR() 函数,然后重置或混淆原始文件,结果在文件夹 A 中找不到更多文件。

有没有办法在不使用 DIR 的情况下检查文件是否存在?

或者,有没有办法拥有一个单独的 DIR 实例?

我想我可以将文件夹 A 中的文件列表构建到一个数组中,然后处理数组中的条目,但这似乎相当“笨拙”

对更好的解决方案有什么建议吗?

谢谢

【问题讨论】:

  • 现在我已经让客户端在 Win7 上运行(我确保他们都避免使用 Vista),我开始认为我应该停止使用 Dir() 并改用文件系统对象,由于安全问题( Dir() 无法处理)。在您的情况下,也许执行第一个 Dir(),将其内容写入数组,然后执行第二个 Dir() 并与您的数组进行比较。

标签: ms-access nested dir file-exists


【解决方案1】:

根据您的操作系统和要求,您可能会发现搜索 SystemIndex 很有用。这里有一些注意事项。

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String

''This is the Windows Search connection string to use
cn.Open "Provider=Search.CollatorDSO;" _
    & "Extended Properties='Application=Windows';"

''SQL SELECT  statement specifies what properties to return,
''            you can add more if you want
''    FROM -  use SystemIndex for a local query or
''            MACHINENAME.SystemIndex for remote
''    WHERE - specify restrictions including SCOPE and other
''            conditions that must be true

''To add scope restriction:
''strSQL = "SELECT System.ItemName, System.ItemTypeText, " _
''       & "System.Size FROM SystemIndex " _
''       & "WHERE Scope='file:c:\Users\'"

strSQL = "SELECT System.ItemName, System.ItemTypeText, " _
       & "System.Size, System.ItemFolderPathDisplay " _
       & "FROM SystemIndex " _
       & "WHERE System.ItemName='AnExampleFile.mdb'"

rs.Open strSQL, cn
rs.MoveFirst

Do Until rs.EOF
    Debug.Print rs.Fields.Item("System.ItemName")
    Debug.Print rs.Fields.Item("System.ItemTypeText")
    Debug.Print rs.Fields.Item("System.Size")
    Debug.Print rs.Fields.Item("System.ItemFolderPathDisplay")
    Debug.Print String(30, "-")
    rs.MoveNext
Loop

rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

更多信息:
http://msdn.microsoft.com/en-us/library/bb266517(VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb419046(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb776859(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb231297(v=VS.85).aspx

【讨论】:

  • Windows 搜索解决方案存在一个主要问题,即本地与远程问题。也就是说,您的本地索引服务不会索引文件服务器上的资源,并且文件服务器的索引服务不会索引本地计算机上的文件。我不在有索引服务器的环境中工作,所以我不知道 Windows 桌面搜索的本地索引是否可以将本地索引与远程索引结合起来,但这是一个我看不到的问题解决方案。此外,我一直无法让它在我的 WinXP 工作站上运行(存在 MAPI32 错误)。
  • 您可以使用Scope搜索其他计算机。我在 XP 上运行过搜索,但我认为最好在 >=Vista 上搜索,因此是最初的评论。搜索还会返回以前连接的外部驱动器中的文件,这可能是一件好事,也可能不是一件好事。在这台速度慢的笔记本电脑上速度非常非常快。
  • >= Vista 要求也是我得出的结论,但我的大多数客户都在 WinXP 上,所以我不会为我客户的任何应用程序考虑这个解决方案。他们都没有Vista,到目前为止只有少数人有Win7。总有一天,它会奏效,但在我看来,就目前而言,这是不切实际的。
【解决方案2】:

我更喜欢文件 API,因为我不太信任 FSO。另请参阅FindFirstFile: Performance Comparison - FSO vs. API 不到一百个文件,性能差异并不那么显着。大量示例代码可用于File API RoutinesFile API Routines的直接文件列表或递归遍历子文件夹

【讨论】:

  • 最近在 Win7 上搜索 C:\ 及其子文件夹时遇到了 Dir() 失败,我一直在考虑尝试 FSO,因为我假设它已经更新以处理更改从 Vista 开始的安全设置。我的猜测是 API 也会更新,但我还没有用 FSO 替换基于 Dir() 的搜索,所以不知道它是否解决了安全问题。
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2018-12-26
相关资源
最近更新 更多