循环打印文本文件正在跳过一些文件(似乎是随机的)

时间:2014-06-25 14:18:30

标签: vb.net

我有一个VB.NET程序,它在目录中列出了一些文本文件并循环遍历它们。对于每个文件,程序使用/ p参数和文件名调用notepad.exe来打印文件,然后将文件复制到历史目录,休眠5秒钟(允许记事本打开并打印),最后删除原始文件。

发生了什么,而不是打印每一个文本文件,它只是打印"随机"目录中的文件。然而,每个单独的文本文件都被复制到历史目录并从原始目录中删除,因此我知道它肯定列出了所有文件并尝试处理每个文件。我已经尝试添加对Thread.Sleep的调用5000毫秒,然后将其更改为10000毫秒,以确保在记事本抓取它以进行打印之前原始文件没有被删除。

我对实际发生的事情比对任何事情更感兴趣(修复也会很好!)。我手动将一些未打印的文件移动到原始目录,将它们从历史目录中删除,然后重新启动程序,在那里DID打印它们应该打印,所以我知道它不应该是文件本身,但与代码有关。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim f() As String = ListFiles("l:\", "997")
    Dim i As Integer
    Try
        For i = 0 To f.Length - 1
            If Not f(i) = "" Then
                System.Diagnostics.Process.Start("Notepad.exe", " /p l:\" & f(i))
                My.Computer.FileSystem.CopyFile("l:\" & f(i), "k:\" & f(i))
                'Thread.Sleep(5000)
                Thread.Sleep(10000)
                My.Computer.FileSystem.DeleteFile("l:\" & f(i))
            End If
        Next
        'Thread.Sleep(5000)
        Thread.Sleep(10000)
    Catch ex As Exception
    End Try
End Sub

Public Function ListFiles(ByVal strFilePath As String, ByVal strFileFilter As String) As String()
    'finds all files in the strFilePath variable and matches them to the strFileFilter variable
    'adds to string array strFiles if filename matches filter
    Dim i As Integer = 0
    Dim strFileName As String
    Dim strFiles(0) As String
    Dim strExclude As String = ""
    Dim pos As Integer = 0
    Dim posinc As Integer = 0

    strFileName = Dir(strFilePath)
    Do While Len(strFileName) > 0
        'check to see if filename matches filter
        If InStr(strFileName, strFileFilter) Then
            If InStr(strFileName, "997") Then
                FileOpen(1, strFilePath & strFileName, OpenMode.Input)
                Do Until EOF(1)
                    strExclude = InputString(1, LOF(1))
                Loop
                pos = InStr(UCase(strExclude), "MANIFEST")
                posinc = posinc + pos
                pos = InStr(UCase(strExclude), "INVOICE")
                posinc = posinc + pos
                FileClose(1)
            Else : posinc = 1
            End If
            If posinc > 0 Then
                'add file to array
                ReDim Preserve strFiles(i)
                strFiles(i) = strFileName
                i += 1
            Else
                My.Computer.FileSystem.MoveFile("l:\" & strFileName, "k:\" & strFileName)
            End If
            'MsgBox(strFileName & " " & IO.File.GetLastWriteTime(strFileName).ToString)
            pos = 0
            posinc = 0
        End If
        'get the next file
        strFileName = Dir()
    Loop

    Return strFiles
End Function

上述代码的简要概述。一个自动程序填充了" L:\"带有文本文件的目录,这个程序需要用" 997"打印出某些文件。在文件名中(即文件名为" 997"文件名中包含文字" INVOICE"或" MANIFEST")。 ListFiles函数正是这样做的,然后回到Form1_Load()子中,它应该打印每个文件,复制它,并删除原始文件。

需要注意的是,此代码是在Windows 7上的Visual Studio 2013中开发的。实际运行此程序的计算机仍在Windows XP上。

1 个答案:

答案 0 :(得分:2)

我可以看到一些问题。第一个也是最明显的是错误处理:

你有一个Try .. Catch没有错误处理。您可能会在不知情的情况下遇到错误!在这里添加一些输出,所以你知道是否是这种情况。

第二个问题是处理Process类的方式。

而不是仅仅在循环中调用System.Diagnostics.Process.Start并且睡眠时应该使用内置的处理执行的方法。你也没有处理任何东西,这让我内心死了。

尝试类似

的内容
    Using p As New System.Diagnostics.Process
        p.Start("Notepad.exe", " /p l:\" & f(i))
        p.WaitForExit()
    End Using

如果发生这两项变更,您就不会有任何问题。如果你这样做,至少应该有错误供你查看并在必要时提供。