2013-05-17 59 views
0

我正在使用ZPL文件,首先製作原件的副本,在新的副本中做一些更改,然後將文件發送到斑馬打印機,最後我想要刪除該文件。使用vb.net發送到打印機後刪除文件

一切都運行完美,除了文件刪除,我得到The process cannot access the file 'c:\test\Test.lbl' because it is being used by another process.

如何刪除後,發送到打印機的文件嗎?

下面是代碼:

Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating 
    Dim OrigFileName As String = "C:\Test\9320\089.lbl" 
    Dim DestFileName As String = "c:\test\Test.lbl" 
    Dim PrinterPath As String = "ZDesigner 110Xi4 600 dpi" 

    Try 
     File.Copy(OrigFileName, DestFileName) 

     File.WriteAllText(DestFileName, File.ReadAllText(DestFileName).Replace("*(A)", TextBox1.Text.Trim())) 
     File.WriteAllText(DestFileName, File.ReadAllText(DestFileName).Replace("*(B)", "1111111")) 
     File.WriteAllText(DestFileName, File.ReadAllText(DestFileName).Replace("*(C)", "222222")) 
     File.WriteAllText(DestFileName, File.ReadAllText(DestFileName).Replace("*(D)", "USA 6"))    

     ' Print the file to the printer. 
     RawPrinterHelper.SendFileToPrinter(PrinterPath, DestFileName) 

    Catch ex As Exception 
     MessageBox.Show("Error: " & ex.Message) 
    Finally 
     File.Delete(DestFileName) 
    End Try 

End Sub 

這裏是RawPrinterHelper代碼:http://support.microsoft.com/kb/322090

Public Class RawPrinterHelper 
' Structure and API declarions: 
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _ 
Structure DOCINFOW 
    <MarshalAs(UnmanagedType.LPWStr)> Public pDocName As String 
    <MarshalAs(UnmanagedType.LPWStr)> Public pOutputFile As String 
    <MarshalAs(UnmanagedType.LPWStr)> Public pDataType As String 
End Structure 

<DllImport("winspool.Drv", EntryPoint:="OpenPrinterW", _ 
    SetLastError:=True, CharSet:=CharSet.Unicode, _ 
    ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function OpenPrinter(ByVal src As String, ByRef hPrinter As IntPtr, ByVal pd As Long) As Boolean 
End Function 
<DllImport("winspool.Drv", EntryPoint:="ClosePrinter", _ 
    SetLastError:=True, CharSet:=CharSet.Unicode, _ 
    ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean 
End Function 
<DllImport("winspool.Drv", EntryPoint:="StartDocPrinterW", _ 
    SetLastError:=True, CharSet:=CharSet.Unicode, _ 
    ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, ByRef pDI As DOCINFOW) As Boolean 
End Function 
<DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", _ 
    SetLastError:=True, CharSet:=CharSet.Unicode, _ 
    ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean 
End Function 
<DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", _ 
    SetLastError:=True, CharSet:=CharSet.Unicode, _ 
    ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean 
End Function 
<DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", _ 
    SetLastError:=True, CharSet:=CharSet.Unicode, _ 
    ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean 
End Function 
<DllImport("winspool.Drv", EntryPoint:="WritePrinter", _ 
    SetLastError:=True, CharSet:=CharSet.Unicode, _ 
    ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function WritePrinter(ByVal hPrinter As IntPtr, ByVal pBytes As IntPtr, ByVal dwCount As Int32, ByRef dwWritten As Int32) As Boolean 
End Function 

' SendBytesToPrinter() 
' When the function is given a printer name and an unmanaged array of 
' bytes, the function sends those bytes to the print queue. 
' Returns True on success or False on failure. 
Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean 
    Dim hPrinter As IntPtr  ' The printer handle. 
    Dim dwError As Int32  ' Last error - in case there was trouble. 
    Dim di As DOCINFOW   ' Describes your document (name, port, data type). 
    Dim dwWritten As Int32  ' The number of bytes written by WritePrinter(). 
    Dim bSuccess As Boolean  ' Your success code. 

    ' Set up the DOCINFO structure. 
    With di 
     .pDocName = "My Visual Basic .NET RAW Document" 
     .pDataType = "RAW" 
    End With 
    ' Assume failure unless you specifically succeed. 
    bSuccess = False 
    If OpenPrinter(szPrinterName, hPrinter, 0) Then 
     If StartDocPrinter(hPrinter, 1, di) Then 
      If StartPagePrinter(hPrinter) Then 
       ' Write your printer-specific bytes to the printer. 
       bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten) 
       EndPagePrinter(hPrinter) 
      End If 
      EndDocPrinter(hPrinter) 
     End If 
     ClosePrinter(hPrinter) 
    End If 
    ' If you did not succeed, GetLastError may give more information 
    ' about why not. 
    If bSuccess = False Then 
     dwError = Marshal.GetLastWin32Error() 
    End If 
    Return bSuccess 
End Function ' SendBytesToPrinter() 

' SendFileToPrinter() 
' When the function is given a file name and a printer name, 
' the function reads the contents of the file and sends the 
' contents to the printer. 
' Presumes that the file contains printer-ready data. 
' Shows how to use the SendBytesToPrinter function. 
' Returns True on success or False on failure. 
Public Shared Function SendFileToPrinter(ByVal szPrinterName As String, ByVal szFileName As String) As Boolean 
    ' Open the file. 
    Dim fs As New FileStream(szFileName, FileMode.Open) 
    ' Create a BinaryReader on the file. 
    Dim br As New BinaryReader(fs) 
    ' Dim an array of bytes large enough to hold the file's contents. 
    Dim bytes(fs.Length) As Byte 
    Dim bSuccess As Boolean 
    ' Your unmanaged pointer. 
    Dim pUnmanagedBytes As IntPtr 

    ' Read the contents of the file into the array. 
    bytes = br.ReadBytes(fs.Length) 
    ' Allocate some unmanaged memory for those bytes. 
    pUnmanagedBytes = Marshal.AllocCoTaskMem(fs.Length) 
    ' Copy the managed byte array into the unmanaged array. 
    Marshal.Copy(bytes, 0, pUnmanagedBytes, fs.Length) 
    ' Send the unmanaged bytes to the printer. 
    bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, fs.Length) 
    ' Free the unmanaged memory that you allocated earlier. 
    Marshal.FreeCoTaskMem(pUnmanagedBytes) 
    Return bSuccess 
End Function ' SendFileToPrinter() 

' When the function is given a string and a printer name, 
' the function sends the string to the printer as raw bytes. 
Public Shared Function SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String) 
    Dim pBytes As IntPtr 
    Dim dwCount As Int32 
    ' How many characters are in the string? 
    dwCount = szString.Length() 
    ' Assume that the printer is expecting ANSI text, and then convert 
    ' the string to ANSI text. 
    pBytes = Marshal.StringToCoTaskMemAnsi(szString) 
    ' Send the converted ANSI string to the printer. 
    SendBytesToPrinter(szPrinterName, pBytes, dwCount) 
    Marshal.FreeCoTaskMem(pBytes) 
End Function 

末級

回答

2

SendFileToPrinter()我的函數的末尾改變到這個,它實際上忘記了在使用它之後關閉BinaryReader;

Marshal.FreeCoTaskMem(pUnmanagedBytes) 
br.Close()         ' <--- Close the BinaryReader 
Return bSuccess 
End Function         ' SendFileToPrinter() 
+0

哇,那很快:那完美的工作!非常感謝 - 5分鐘接受你的回答 – Somebody

+2

這個作品。但是你也可以看看'使用'語句來解決像這樣的各種問題。 http://msdn.microsoft.com/en-us/library/htd05whh.aspx – 5uperdan

+0

你是對的@ 5uperdan謝謝4提示;) – Somebody