要么纠正VB6 / DOS / SQL函数,要么建议更好的替代方案

时间:2016-02-12 00:04:14

标签: sql vb6 dos

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

有问题的代码是在带有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的先前存在管道没有标题的目录按文件大小从最小到最大排序到c:\ test.txt。

然后我将以下代码插入到开头的预先存在的代码中:

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

当我单步执行代码时,我可以看到这是正常的,除了稍后在代码中我得到了

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

关于分配FileSystemObject。我是否正确地猜测FSO和Shell不能很好地协同工作?此外,如果你可以建议一个更好的替代方案,从现有目录中获取最小的文件,建议表示赞赏。

2 个答案:

答案 0 :(得分:2)

无需排序。

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

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

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

看起来非常简单,我缺少什么?

答案 1 :(得分:0)

另一种方法是使用FileSystemObject的Files集合。只需迭代给定文件夹的文件集合,并评估每个File对象的Size属性。只要你在一个文件夹中没有一百万个文件,性能应该没问题。