2016-12-19 1 views
-1

Я пытаюсь скопировать файл с моего локального компьютера на FTP-сервер с помощью C#. Когда я использую приведенный ниже код, файл полностью копируется на FTP-сервер, но ** исходные строки разрезаются на куски длиной всего 512 байт, тогда как они должны быть длиной 1152,1126 или 1024 байта. ** В этом примере файл я теперь 16 строк вместо 7.Поток записывает только 512 байт в файл на FTP-сервере, используя C#

public void uploadLOTFILE(string username, string password) 
    { 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://mysite.mine/mypathandfilename"); 
     request.Method = WebRequestMethods.Ftp.UploadFile; 
     request.Credentials = new NetworkCredential(username, password); 
     request.KeepAlive = true; 
     System.IO.Stream rs = request.GetRequestStream(); 

     var lines = File.ReadLines(@"myLocalFile.txt"); 
     foreach (var line in lines) 
     { 
      byte[] buffer = Encoding.ASCII.GetBytes(line);     
      Console.WriteLine("buffer.length:" + buffer.Length.ToString()); 
      rs.Write(buffer,0,buffer.Length); 
     } 
     rs.Close(); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

     Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription); 

     response.Close(); 
     } 

выход из Console.WriteLine для примера файла:

buffer.length: 1152

буфера. длина: 1126

buffer.length: 1152

buffer.length: 1152

buffer.length: 1152

buffer.length: 1152

buffer.length: 1024

Я также использовал точную копию из MSDN (https://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx), но это было то же самое результат.

Edit: также попытался следующий код: строка Filepath = @ "MyFilePath"; var fileName = Path.GetFileName (filePath); var request = (FtpWebRequest) WebRequest.Create ("ftp://myftp");

 request.Method = WebRequestMethods.Ftp.UploadFile; 
     request.Credentials = new NetworkCredential(username, password); 
     request.UsePassive = true; 
     request.UseBinary = true; 
     request.KeepAlive = false; 

     using (var fileStream = File.OpenRead(filePath)) 
     { 
      using (var requestStream = request.GetRequestStream()) 
      { 
       fileStream.CopyTo(requestStream); 
       requestStream.Close(); 
      } 
     } 

Это дает тот же результат. Файл полностью копируется, но каждый 512 байт добавляется новая строка.

С помощью FileZilla я могу выполнить правильную передачу FTP одного и того же типа файлов.

+0

* «файл полностью скопирован на FTP-сервер, но строки имеют длину всего 512 байтов» * - Это не имеет смысла. Так файл полностью скопирован или нет? –

+0

Как вы можете проверить, что линии имеют длину всего 512 строк? –

+0

Что вы на самом деле пытаетесь сделать? Почему вы загружаете файл по строкам? –

ответ

0

Я решил проблему, используя встроенные окна FTP, доступные с помощью cmd.

  string[] lines = { username, password, "remote directory", "put " + "\"" + filePath + "\"" , "bye"}; 
     // WriteAllLines creates a file, writes a collection of strings to the file, 
     // and then closes the file. You do NOT need to call Flush() or Close(). 
     System.IO.File.WriteAllLines("full file path of your script", lines); 
     Process cmd = new Process(); 
     cmd.StartInfo.FileName = "cmd.exe"; 
     cmd.StartInfo.RedirectStandardInput = true; 
     cmd.StartInfo.RedirectStandardOutput = true; 
     cmd.StartInfo.CreateNoWindow = true; 
     cmd.StartInfo.UseShellExecute = false; 
     cmd.Start(); 

     cmd.StandardInput.WriteLine(@"ftp -s:" + "\"" + "full file path of your script" + "\"" + " remote device"); 
     cmd.StandardInput.Flush(); 
     cmd.StandardInput.Close(); 
     cmd.WaitForExit(); 
Смежные вопросы