2012-05-25 4 views
0

우리는 레이블 프린터 A4 +를 가지고 있으며 우리는 우리가 DBF 파일을 만들기로 결정한 다른 글꼴과는 다른 lables를 인쇄하기 위해 우리 창고에 많은 양의 레이블을 인쇄하는 데 사용합니다. 각 인쇄 작업, 그래서 DBF 파일이 다른 기록의 번호를 포함 할 때마다 우리의 웹 서비스는 A4 + 프린터에 FTP 요청을하고 프린터에 DBF 파일을 ftp로 보내면 인쇄 명령이 프린터로 전송되고 DBF 파일이 인쇄됩니다. 대부분의 경우 모든 단계가 성공적으로 수행되지만 때로는 프린터의 DBF 파일이 웹 서비스에서 작성된 dbf 파일과 약간 다르며 파일의 헤더에 diffrence가 있으므로 문제의 원인이 프린터는 레이블을 인쇄하지만 DBF 파일의 끝에는 인쇄하지 않습니다. 예를 들어 DBF 파일에 500 개의 레코드가 있고 프린터 인쇄가 300 레코드 또는 다른 번호로 인쇄 된 다음 인쇄가 계속되지만 레이블에 데이터가 없으면 300 프린터 이후를 의미합니다. dbf 파일을 읽고 라벨은 아주 원시이지만 인쇄 명령이 500 (DBF 파일에도 500 개의 레코드가 포함되어 있음)이므로 레이블이 500까지 계속 공급됩니다.FTP 파일이 잘못 전송 됨

호스트의 서버에있는 DBF 파일 웹 서비스 (이것은 dbf 파일을 생성하는 곳입니다)와 프린터의 ftp 파일은 동일합니다. 파일의 헤더 부분은 약간의 차이가 있습니다. 이 문제를 만든다.

나는 우리가 DBF 파일을 만드는 코드와이 파일을 프린터에 ftp하기 위해 사용하는 코드를 포함하고 있으며 샘플을 위해 두 DBF 파일을 모두 첨부합니다.

우리 팀이 프로젝트에서 작업하며 웹 사이트의 도움을 조사하지만,이 시점에서는 모든 것이 정상이며이 사건을 디버그 할 수 없으므로 해결할 수 있습니다.

------------------------ DBF 파일 만들기 ------------------- -----------------------------------

private bool EportDBF(string filePath, List<BarcodeData> list) 
    { 
     string tableName = string.Empty; 
     string folderPath = string.Empty; 

     GetFileNameAndPath(filePath, ref tableName, ref folderPath); 

     string connString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + folderPath + "; Extended Properties=DBASE IV;"; 
     string createStatement = "Create Table " + tableName + " ("; 
     string insertStatement = "Insert Into " + tableName + " Values ("; 
     string insertTemp = string.Empty; 

     OleDbConnection conn = new OleDbConnection(connString); 

     try 
     { 

      createStatement += "[RW] varchar(4), "; 
      createStatement += "[CODE] varchar(16), "; 
      createStatement += "[DESC] varchar(16), "; 
      createStatement += "[WEIGHT] varchar(16), "; 
      createStatement += "[DATE] varchar(32), "; 
      createStatement += "[RCODE] varchar(16), "; 
      createStatement += "[BCODE] varchar(16))"; 

      conn.Open(); 

      DataSet dsFill = new DataSet(); 

      OleDbDataAdapter daInsertTable = new OleDbDataAdapter(createStatement, conn); 

      daInsertTable.Fill(dsFill); 

      int row = 1001; 

      foreach (var item in list) 
      { 
       insertTemp = insertStatement; 

       insertTemp += "'" + row++ + "' , "; 
       insertTemp += "'" + item.ItemCode + "' , "; 
       insertTemp += "'0' , "; 
       insertTemp += "'" + item.Weight + "' , "; 
       insertTemp += "'" + item.DateTime + "' , "; 
       insertTemp += "'" + item.ReferenceCode + "' , "; 
       insertTemp += "'" + item.Barcode.ToString() + "') ;"; 

       daInsertTable = new OleDbDataAdapter(insertTemp, conn); 

       daInsertTable.Fill(dsFill); 
      } 

      conn.Close(); 
      conn.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      conn.Close(); 
      conn.Dispose(); 

      return false; 
     } 

     return true; 
    } 

-------- ---------------- 프린터에 FTP DBF 파일 -----------------------------


--------------

private bool UpLoadDBF(List<BarcodeData> barcodeDatas, string path) 
    { 
     try 
     { 
      EportDBF(path, barcodeDatas); 

      FtpWebRequest request; 
      FtpWebResponse response; 

      Stream sourceStream = new MemoryStream(); 
      Stream requestStream = sourceStream; 
      StreamReader reader = new StreamReader(path); 

      try 
      { 
       request = (FtpWebRequest)WebRequest.Create("ftp://" + printerIP + "/card/barcodes.dbf"); 
       request.Method = WebRequestMethods.Ftp.UploadFile; 
       request.KeepAlive = false; 
       request.Credentials = new NetworkCredential(user, password); 

       byte[] byteArray = Encoding.Default.GetBytes(reader.ReadToEnd()); 
       sourceStream = new MemoryStream(byteArray); 

       try 
       { 
        requestStream = request.GetRequestStream(); 
       } 
       finally 
       { 
        request.ContentLength = sourceStream.Length; 

        byte[] buffer = new byte[sourceStream.Length]; 
        int count = 2048; 
        if (sourceStream.Length < count) 
         count = (int) sourceStream.Length; 

        int bytesRead = sourceStream.Read(buffer, 0, count); 

        do 
        { 
         requestStream.Write(buffer, 0, bytesRead); 
         bytesRead = sourceStream.Read(buffer, 0, count); 

        } while (bytesRead > 0); 

        sourceStream.Close(); 
        requestStream.Close(); 
       } 
      } 
      catch (Exception ex) 
      { 
      } 
      finally 
      { 
       request = null; 

       sourceStream.Close(); 
       sourceStream.Dispose(); 

       reader.Close(); 
       reader.Dispose(); 

       requestStream.Close(); 
       requestStream.Dispose(); 
      } 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

     return true; 
    } 
그래서 돈

답변

0

inadvance 덕분에 당신이 Encoding.D을 사용한 이유를 알고 efault.GetBytes로 바이트를 읽습니다. 대신에 FileStream의 Read 메소드를 사용하여 바이트를 읽습니다. 희망이 도움이됩니다.

+0

감사합니다. 파일 스트림이 정상적으로 작동합니다. – ali