2015-07-02 2 views
1

Я загружаю TextFiles с FTP-сервера с помощью этого кода (каталогов содержит список файлов/каталогов с FTP-сервера):FTP загрузки преобразует CrLf Л.Ф.

for (int i = 0; i <= directories.Count - 1; i++) 
     { 
      int bytesRead = 0; 
      byte[] buffer = new byte[2048]; 
      string trnsfrpth = f.getConfig("TempPath") + @"/" + directories[i].ToString(); 

      if (directories[i].Contains(".") && !(directories[i].ToString().Equals(".") || directories[i].ToString().Equals(".."))) 
      { 
       FtpWebRequest fileFtpRequest = (FtpWebRequest)WebRequest.Create(f.getConfig("FTP") + @"/" + directories[i].ToString()); 
       fileFtpRequest.UseBinary = true; 
       fileFtpRequest.Credentials = credentials; 
       fileFtpRequest.Method = WebRequestMethods.Ftp.DownloadFile; 

       Stream fileResponse = fileFtpRequest.GetResponse().GetResponseStream(); 
       FileStream fileStream = new FileStream(trnsfrpth, FileMode.Create); 

       while (true) 
       { 
        bytesRead = fileResponse.Read(buffer, 0, buffer.Length); 

        if (bytesRead == 0) 
         break; 

        fileStream.Write(buffer, 0, bytesRead); 
       } 
       fileStream.Close(); 

      } 

Файлы, которые я получаю все есть LF как символ разрыва строки. Я не уверен на 100%, что файлы имеют прерывание линии CR LF для начала. Но если я загружаю их через FileZilla, они используют CR LF. Мне нужна CR-версия файла LF. Я хотел спросить, что я делаю что-то неправильно здесь, или если этот код в порядке, и FileZilla автоматически преобразует файлы при загрузке, и мне нужно заменить LF вручную.

ответ

2

У вас есть fileFtpRequest.UseBinary = true;, и вы используете двоичный FileStream на стороне загрузки.

Так что клиент FTP не конвертирует ничего, вы хотите, чтобы преобразование, которое, по-видимому, делает FilZilla, но которое вы не получаете.

Вы можете попробовать UseBinary=false, но документы неясны относительно эффекта.

StreamReader принимает «\ п», так что вы могли бы заменить while(true) часть с

using (Stream fileResponse = fileFtpRequest.GetResponse().GetResponseStream()) 
using (var reader = new StreamReader(fileResponse)) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
     something.WriteLine(line); // here you get the .NET line ending 
    } 
} 
+2

'UseBinary = false;' сделал это. Все, кого я попросил, сказали мне, что я должен установить его в истинное положение и что мне придется искать где-то в другом месте. - Спасибо за быстрый ответ! – FNR

1

Передача в режиме «Binary» из FTP копий файлов точно, байт за байтом. Простой и понятный.

При переносе текстовых файлов между различными операционными системами, это может быть не то, что вы хотите - разные операционные системы используют разные коды для представления разрывов строк. Для этой цели существует режим «ASCII»: он автоматически переводит все окончания строк из формата исходной системы в пункт назначения. LINK

Смежные вопросы