После передачи текстовых файлов в них появляются пустые строки - PullRequest
0 голосов
/ 07 августа 2011

РЕДАКТИРОВАТЬ: Filezilla вызвал проблему, когда я загружаю файлы обратно с сервера, он добавил новые строки.Прошу прощения за путаницу.


Этот метод загружает файлы на FTP-сервер, и он работает нормально, но в текстовых файлах, загруженных на сервер, после каждой строки появляются пустые строки (появляется "cr lf"), дляпример:

File: 
First line
Second line
Third line

Uploaded file:
First line

Second line

Third line

Исходные и загруженные файлы соответственно имеют разные размеры, нетекстовые файлы одинаковы.

Код:

private void sendFile(string In, string Out)
{   
    FtpWebRequest request = (FtpWebRequest) WebRequest.Create("ftp://domain//" + Out);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential("username", "password");             

    FileStream sourceStream = new FileStream(In, FileMode.Open, FileAccess.Read, FileShare.Read);
    byte[] fileContents = new byte[sourceStream.Length];
    sourceStream.Read(fileContents, 0, (int) sourceStream.Length);
    sorceStream.Close();

    request.ContentLength = fileContents.Length;
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(fileContents, 0, fileContents.Length);

    requestStream.Close();
}

Как я могу это исправить

Ответы [ 3 ]

2 голосов
/ 19 апреля 2012

Странно. Я столкнулся с той же проблемой и не смог ее исправить, пока не указал расширение в файле. Например, если мое имя файла было

ABCFile

тогда я делаю это abcfile.dat и после этого он показывает мне загруженный файл как фактический файл. Я снова загружаю файл с помощью abcfile.txt, но на этот раз проблема с пустой строкой появляется в моем загруженном файле.

Я предлагаю вам предоставить расширение для вашего файла, кроме .txt.

2 голосов
/ 07 августа 2011

РЕДАКТИРОВАТЬ: Поскольку приведенный ниже ответ, кажется, не помог (но я оставляю его там для потомков, поскольку он показывает лучший код), вот следующие шаги диагностики, которые я бы проверил:

  • Как вы просматриваете файлы?Если это вообще возможно, зайдите на сервер напрямую, а не извлекайте файлы снова через веб-браузер или что-то еще.
  • К какому типу FTP-сервера вы подключаетесь?Возможно, есть известная проблема.
  • Вы пытались посмотреть, что на самом деле отправляется через Wireshark ?
  • Вы пытались отправить те же файлы через обычный FTP-клиент?

Вы должны установить для FtpWebRequest.UseBinary значение true, чтобы сохранить точное содержимое файла.В противном случае обе системы будут пытаться определить окончания строк сами, изменяя терминаторы строк так, как они считают нужным.Я очень редко думаю, что это хорошая идея.(РЕДАКТИРОВАТЬ: UseBinary на самом деле true по умолчанию, но это звучит как вид проблемы, возникающей при использовании текстового режима ... делать это явно не вредно.)

Дополнительно:

  • Вы должны избавиться от своего FileStream с помощью оператора using
  • Вы должны избавиться от потока запроса с помощью оператора using
  • Вы должны принять к сведению результат Stream.Read - он не всегда должен читать все запрошенные данные за один раз
  • Вы можете использовать File.ReadAllBytes, чтобы просто прочитатьзавершите данные файла за один раз или используйте Stream.CopyTo (если вы используете .NET 4), чтобы скопировать FileStream в поток запросов (который, конечно, не будет устанавливать длину содержимого; я не знаю,является ли это проблемой)
  • Вы никогда не звоните GetResponse;неясно, что именно произойдет, если вы никогда не получите ответ FtpWebRequest
  • Ваши имена параметров не соответствуют соглашениям об именах .NET и не очень описательны

Я бы, наверное, использовал:

private void SendFile(string inputFile, string outputPath)
{   
    FtpWebRequest request = (FtpWebRequest) WebRequest.Create
        ("ftp://domain//" + outputPath);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = true;
    request.Credentials = new NetworkCredential("username", "password");

    byte[] fileContents = File.ReadAllBytes(inputFile);
    request.ContentLength = fileContents.Length;

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(fileContents, 0, fileContents.Length);
    }

    // This *may* be necessary in order to validate that everything has happened
    using (WebResponse response = request.GetResponse())
    {
    }
}
1 голос
/ 07 августа 2011

Система, в которую вы отправляете, использует разные окончания строк в зависимости от того, что использует ваша система. Я могу предположить, потому что вы получаете дополнительную строку, что вы находитесь в Windows, и она использует окончания CRLF. Система, в которую вы отправляете, распознает CR и LF как отдельные окончания, поэтому вы получаете дополнительные строки.

Для текста, обрежьте LF или CR, посмотрите, что происходит. Я понятия не имею о различающихся размерах файлов.

...