2013-08-26 4 views
0

У меня есть код, где я отправляю xml-файл на ftp-сервер, но размер файла на ftp-сервере меньше исходного. Я пытаюсь включить двоичную передачу, но результат все тот же.Загрузить файл xml на ftp двоичный

FileInfo f = new FileInfo("C:\\Users\\L\\Desktop\\data.xml"); 
      long original_vel = f.Length; 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://***"); 
      request.UseBinary = true; 
      request.Method = WebRequestMethods.Ftp.GetFileSize; 
      request.Method = WebRequestMethods.Ftp.UploadFile; 
      request.Credentials = new NetworkCredential("*****", "*****"); 

      StreamReader sourceStream = new StreamReader(@"C:\\Users\\L\\Desktop\\data.xml"); 
      byte[] fileContents = Encoding.Unicode.GetBytes(sourceStream.ReadToEnd()); 
      sourceStream.Close(); 
      request.ContentLength = fileContents.Length; 
      long ftp_vel = request.ContentLength;  
      Stream requestStream = request.GetRequestStream(); 
      requestStream.Write(fileContents, 0, fileContents.Length); 
      requestStream.Close(); 
      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      if (original_vel == ftp_vel) 
      { 
       response.Close(); 
      } 
      else 
      {     
       Odesilani(); 
      } 

Размер оригинального файла 294 672, но файл на фтп есть 294 670. The xml file on ftp is valid....But when i compare files in total comander, the original file have: FF FE 3C 00 3F 00.....and the file on ftp have 3C 00 3F 00... Но содержание файла в порядке ...:/ У вас есть идея?

ответ

0

Действительно ли файл XML на сервере действителен? Из вашего кода вы читаете файл, используя Unicode. Файлы, закодированные с помощью юникода, обычно имеют символ, который помещается в начале файла с именем Byte Order Mark. Это может быть причиной того, что у вас есть разница в 2 байта, поскольку она была потеряна во время преобразования.

UPDATE Правильный Byte Order Mark для любой кодировки дается Encoding.GetPreamble() затруднительного положения в код выше будет ..

 StreamReader sourceStream = new StreamReader(@"C:\\Users\\L\\Desktop\\data.xml"); 

     //Get Preamble and File Contents 
     byte[] bom = Encoding.Unicode.GetPreamble(); 
     byte[] content = Encoding.Unicode.GetBytes(sourceStream.ReadToEnd()); 

     //Create Destination array 
     byte[] fileContents = new Byte[bom.Length + content.Length]; 

     //Copy arrays into destination appending bom if available 
     Array.Copy(bom, 0, fileContents, 0, bom.Length); 
     Array.Copy(content, 0, fileContents, bom.Length, content.Length); 


     request.ContentLength = fileContents.Length; 
     long ftp_vel = request.ContentLength; 
     Stream requestStream = request.GetRequestStream(); 
     requestStream.Write(fileContents, 0, fileContents.Length); 
     requestStream.Close(); 
     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     if (original_vel == ftp_vel) 
     { 
      response.Close(); 
     } 
     else 
     { 
      Odesilani(); 
     } 

+0

Да, файл XML является действительным .... Но когда я сравнить файлы в общем комманде, файл оригинала имеют: FF FE 3C 00 3F 00 ..... и файл на ftp имеет 3C 00 3F 00 ... Но содержимое файла в порядке ...:/ – Kate

+0

Если вы все еще хотите, чтобы он был перенесен с остальной частью содержимого, вам придется вручную добавить его в начало массива байтов. 'byte [] stuff = новый байт [fileContents.Length + 2]; 'Array.Copy (fileContents, 0, stuff, 2, fileContents.length); 'stuff [0] = 0xff; 'stuff [1] = 0xfe; fileContents = stuff; – Ody

+0

Невозможно передать файл xml в двоичном режиме? Потому что, когда я пытаюсь отправить файл * .exe, результат ужасен:/ – Kate