2013-05-17 2 views
0

Je travaille avec des fichiers ZPL, d'abord je fais une copie de l'original, faire un changement dans le nouveau, puis envoyer le fichier à l'imprimante zèbre, et enfin je vouloir supprimer le fichier.supprimer le fichier après envoyé à l'imprimante en utilisant vb.net

Tout fonctionne parfaitement, sauf la suppression du fichier, je reçois The process cannot access the file 'c:\test\Test.lbl' because it is being used by another process.

Comment puis-je supprimer le fichier après envoyé à l'imprimante?

Voici le 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: " & ex.Message) 
    Finally 
     File.Delete(DestFileName) 
    End Try 

End Sub 

Voici le code RawPrinterHelper de: 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 

End Class

Répondre

2

En SendFileToPrinter() je changerais la fin de la fonction à cette , il oublie réellement de fermer le BinaryReader après l'avoir utilisé;

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

Wow, c'était rapide: | cela a fonctionné parfaitement! merci beaucoup - 5 minutes pour accepter votre réponse – Somebody

+2

cela fonctionne. Mais vous aimerez peut-être aussi regarder "en utilisant" des déclarations qui résoudront toutes sortes de problèmes comme celui-ci. http://msdn.microsoft.com/en-us/library/htd05whh.aspx – 5uperdan

+0

vous avez raison @ 5uperdan merci 4 la pointe;) – Somebody

Questions connexes