如何判断文件是否写完了

时间:2015-03-02 19:00:45

标签: vb.net

我正致力于将应用程序变成一个"听众"各种各样的。该程序使用数据库中的数据处理ZPL运输标签模板的填写。我们有多个程序可以调用这个标签程序,除了一个之外的所有程序都有一个连接到PC的Zebra打印机,标签程序会检测到这些程序并在完成填充后自动打印标签。

在另一个应用程序中,即用户拥有可穿戴终端和无线Zebra标签打印机的拣选程序,它会导致问题。标签程序通过队列/堆栈表知道要处理什么,其中条目链接到填充队列的机器名称。在拾取程序中,而不是将ZPL发送到打印机的标签程序,它是'将ZPL写入文件,以便拣选程序可以读取ZPL并修改无线斑马的命令。

在标签程序运行并创建包含ZPL的文本文件后,我在拾取程序中遇到了问题。对于一些客户,标签程序可以将最多4个ZPL写入同一个文件中,并且我需要在拾取程序中知道它何时完成对文件的写入并且文件已准备好进行读取。现在我正在检查机器的标签队列是否为空,但该文件始终无法打开。

我的代码如下。我基本上需要找到一些知道何时完成文件写入并准备好读取的方法,但我需要考虑标签程序可能会出错并且根本不会写文件。

StartPrintLabelListener()只是启动标签程序(如果它尚未运行),CheckCartonLabelQueueEmpty()检查队列表中是否没有用户记录,返回布尔值。正如您在下面所看到的,我最近克服文件尚未准备好的尝试包括一个延迟1/10秒的循环,每次迭代都要进行几次检查(如果生成时需要太长时间)文件,将发生错误。)

Private Sub PrintLabel(strCartonID As String)
    Try
        Dim drCH As OracleDataReader = selectCartonInformation(strCartonID)
        Dim dteDateModified As DateTime = Nothing, dteNewDateModified As DateTime = Nothing
        Dim strTmpFileName As String = "C:\tmp\tmplabel.zpl"

        If System.IO.File.Exists(strTmpFileName) Then
            dteDateModified = System.IO.File.GetLastWriteTime(strTmpFileName)
            System.IO.File.Delete(strTmpFileName)
        End If

        If drCH.Read Then
            'insert the carton into the queue to be printed
            insertCartonLabelQueue(Convert.ToInt32(drCH.Item("SKLC_CH")))
        End If

        'start the print label listener if it isn't running for this user already
        StartPrintLabelListener()

        'now that the print label program is running, keep checking the SKLC_CARTONLABELQ to see if the label finished processing or until tmrLabelTimer elapses
        Dim intLabelTimer As Integer = 0
        Dim blnPrintLabelComplete As Boolean = False, blnCartonLabelQueueEmpty As Boolean = False, blnFileExists As Boolean = False, intFileExistsCheck As Integer = 0
        While Not blnPrintLabelComplete And intLabelTimer < 20000
            If Not blnCartonLabelQueueEmpty Then
                blnCartonLabelQueueEmpty = CheckCartonLabelQueueEmpty(Convert.ToInt32(drCH.Item("SKLC_CH")))
            End If

            If System.IO.File.Exists(strTmpFileName) Then
                intFileExistsCheck += 1
            End If

            blnFileExists = (intFileExistsCheck > 3)

            If blnCartonLabelQueueEmpty And blnFileExists Then
                blnPrintLabelComplete = True
            End If

            intLabelTimer += 100
            System.Threading.Thread.Sleep(100)
        End While

        'if blnPrintLabelComplete is set to true, vbPrintLabel processed the label. check the tmp file attributes to be sure it's actually a new file
        If blnPrintLabelComplete Then
            If System.IO.File.Exists(strTmpFileName) Then
                dteNewDateModified = System.IO.File.GetLastWriteTime(strTmpFileName)
            End If

            If dteNewDateModified = Nothing Or (Not dteNewDateModified = Nothing AndAlso Not dteDateModified = Nothing AndAlso dteNewDateModified <= dteDateModified) Then
                Throw New PrintLabelException("An error has occurred while generating the label.")
            End If

            If Not ZebraPrinter.PrintTmpFile(CurPicker.UserName) Then
                Throw New PrintLabelException("An error has occurred while printing the label.")
            End If
        Else
            deleteCartonsFromQueue(intSessionID)
            Throw New PrintLabelException("An error has occurred while generating the label.")
        End If
    Catch ex As Exception
        If TypeOf (ex) Is PrintLabelException Then
            Throw
        Else
            Throw New PrintLabelException("An error has occurred while printing the label.", ex)
        End If
    End Try
End Sub

0 个答案:

没有答案