title: delete file after sent to printer using vb.net
body: <p>I'm working with ZPL files, first I make a copy of the original, do some change in the new one, then send the file to the zebra printer, and finally I want to delete the file.</p>
  
  <p>Everything works perfect except the file deletion, I get <code>The process cannot access the file 'c:\test\Test.lbl' because it is being used by another process.</code></p>
  
  <p>How can I delete the file after sent to printer?</p>
  
  <p>Here is the code:</p>
  
  <pre><code>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: " &amp; ex.Message)
      Finally
          File.Delete(DestFileName)
      End Try
  
  End Sub
  </code></pre>
  
  <p>Here is the <code>RawPrinterHelper</code> code from: <a href="http://support.microsoft.com/kb/322090" rel="nofollow">http://support.microsoft.com/kb/322090</a></p>
  
  <pre><code>Public Class RawPrinterHelper
  ' Structure and API declarions:
  &lt;StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)&gt; _
  Structure DOCINFOW
      &lt;MarshalAs(UnmanagedType.LPWStr)&gt; Public pDocName As String
      &lt;MarshalAs(UnmanagedType.LPWStr)&gt; Public pOutputFile As String
      &lt;MarshalAs(UnmanagedType.LPWStr)&gt; Public pDataType As String
  End Structure
  
  &lt;DllImport("winspool.Drv", EntryPoint:="OpenPrinterW", _
     SetLastError:=True, CharSet:=CharSet.Unicode, _
     ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)&gt; _
  Public Shared Function OpenPrinter(ByVal src As String, ByRef hPrinter As IntPtr, ByVal pd As Long) As Boolean
  End Function
  &lt;DllImport("winspool.Drv", EntryPoint:="ClosePrinter", _
     SetLastError:=True, CharSet:=CharSet.Unicode, _
     ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)&gt; _
  Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
  End Function
  &lt;DllImport("winspool.Drv", EntryPoint:="StartDocPrinterW", _
     SetLastError:=True, CharSet:=CharSet.Unicode, _
     ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)&gt; _
  Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, ByRef pDI As DOCINFOW) As Boolean
  End Function
  &lt;DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", _
     SetLastError:=True, CharSet:=CharSet.Unicode, _
     ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)&gt; _
  Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean
  End Function
  &lt;DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", _
     SetLastError:=True, CharSet:=CharSet.Unicode, _
     ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)&gt; _
  Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean
  End Function
  &lt;DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", _
     SetLastError:=True, CharSet:=CharSet.Unicode, _
     ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)&gt; _
  Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean
  End Function
  &lt;DllImport("winspool.Drv", EntryPoint:="WritePrinter", _
     SetLastError:=True, CharSet:=CharSet.Unicode, _
     ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)&gt; _
  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
  </code></pre>
  
  <p>End Class</p>