修正 VB6/DOS/SQL 函数或提出更好的替代方案

Either correct VB6/DOS/SQL function or suggest better alternative

我目前正在重新编写很久以前由一个不太熟练的程序员编写的代码。授予代码有效,并且已经使用了很多年,但效率不高。

有问题的代码在具有 SQL 调用的 VB6 中,它检查驱动器上的特定目录(在本例中我们将使用 c:\files),如果文件存在,它会移动该文件到处理目录加载该特定文件的参数并相应地处理它们。

目前代码使用VB6中的DIR函数来识别相应目录中的文件。唯一的问题是,如果目录中存在许多文件,那么它是否会抓取 5kb 文件并在 3 秒内处理它,或者它是否会抓取 500,000kb 文件而不处理任何其他文件,这是一个废话。接下来的 10 分钟。

我搜索了许多留言板以找到某种方法让它选择最小的文件并发现我可以构建一个复杂的数组来执行类似于排序的操作但我决定尝试其他想法而不是希望减少涉及的处理时间.使用古老的 DOS 知识,我创建了一些应该可以工作的东西,但由于某种原因不能(因此张贴在这里)。

我制作了一个我们称之为 c:\test.bat 的批处理文件,其中包含以下几行:

delete c:\test.txt
dir /OS /B c:\files\*.txt>c:\test.txt

这将删除先前存在的 test.txt 管道目录,没有 headers 按文件大小从小到大排序到 c:\test.txt.

然后我在 pre-existing 代码的开头插入了以下代码:

Shell "c:\test.bat", vbHide
filepath = "c:\test.txt"
Open filepath For Input As #1
Input #1, filegrabber
Close #1

当我单步执行代码时,我可以看到它正常工作,除了现在稍后在代码中我得到一个

运行时错误 91 Object 变量或未设置块变量

关于分配文件系统Object。我猜测 FSO 和 Shell 不能很好地协同工作是否正确?此外,如果您可以提出一个更好的替代方法来从现有目录中获取最小文件,我们将不胜感激。

不需要排序。

只需使用 Dir() 浏览目录。在循环之前将 Smallest Long 变量设置为 &H7FFFFFFF 然后在循环内使用 FileLen() 函数测试每个返回的文件名。

如果 FileLen() returns 小于 Smallest 的值,则将该大小分配给 Smallest 并将该文件名分配给 SmallestFile 一个字符串变量。

如果 Smallest = &H7FFFFFFF 没有文件,则循环退出,否则 SmallestFile 有您的文件名。

看起来非常简单,我错过了什么?

另一种方法是使用 FileSystemObject 的文件集合。只需迭代给定文件夹的文件集合并评估每个文件对象的大小 属性。只要您的文件夹中没有一百万个文件或其他东西,性能应该没问题。