2010-01-22 3 views
0

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

private void btnSave_Click(object sender, EventArgs e) 
{ 
    UriBuilder b = new UriBuilder(); 
    b.Host = "ftp.myserver.com"; 
    b.UserName = "user"; 
    b.Password = "pass"; 
    b.Port = 21; 
    b.Path = "/myserver.com/directories/" + selected + ".txt"; 
    b.Scheme = Uri.UriSchemeFtp; 
    Uri g = b.Uri; 

    System.Net.FtpWebRequest c = (System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create(g); 
    c.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; 

    System.Net.FtpWebResponse d = (System.Net.FtpWebResponse)c.GetResponse(); 

    System.IO.Stream h = d.GetResponseStream; 
    System.IO.StreamWriter SW = new System.IO.StreamWriter(h); 
    String[] contents = textBox1.Lines.ToArray(); 
    for (int i = 0; i < contents.Length; i++) 
    { 
     SW.WriteLine(contents[i]); 
    } 



    h.Close(); 
    SW.Close(); 

    d.Close(); 
} 

Ошибка я получаю эта линия:

System.IO.StreamWriter SW = новый System.IO.StreamWriter (ч);

Стрим не был доступен для записи.

Любые идеи?

ответ

5

ответ поток из FTP-сайта данные от На сайте к вы. Вам понадобится запрос ... но тогда вам не нужен метод DownloadFile - вы не загружаете, вы загружаете, поэтому вы хотите использовать метод UploadFile.

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

  • Вы ничего не закрываем, если исключения выбрасываются: используйте using блоки для этого.
  • Плохая идея, чтобы сделать доступ к сети, как это в потоке пользовательского интерфейса; поток пользовательского интерфейса блокируется (так что весь пользовательский интерфейс будет зависать), в то время как запрос FTP происходит. Вместо этого используйте фоновый поток.
+0

Когда я включаю, чтобы загрузить файл, который я получаю сообщение об ошибке с этой линией: System.IO.Stream ч = d.GetResponseStream; Невозможно преобразовать группу методов 'GetResponseStream' в не-делегатский тип 'System.IO.Stream'. Вы намеревались вызвать метод? – David

+0

Теперь я получаю сообщение об ошибке с этой строкой: System.IO.StreamWriter SW = new System.IO.StreamWriter (h); Поток не был доступен для записи ... – David

+0

Как я уже сказал в ответ, вы не должны открывать поток ответов вообще - вы должны открывать поток * request *. –

5

Чтобы загрузить файл, вам необходимо использовать класс FtpWebRequest.

Цитата:

При использовании объекта FtpWebRequest для загрузить файл на сервер, вы должны записать содержимое файла в поток запрос , полученном с помощью вызова метода GetRequestStream или его асинхронных аналогов , BeginGetRequestStream и EndGetRequestStream методы. Вы должны записать в поток и закрыть поток перед отправкой запроса.

Пример загрузки файла (который вы можете изменить для записи потока контента, как в вашем примере) see here.

+0

У меня нет возможности добавить поток getrequest - он продолжает бросать мне ошибки. – David

+0

@David: «он продолжает бросать мне ошибки» не очень точный ... не могли бы вы дать точное сообщение об ошибке? –

0

Взятые из MSDN и слегка изменен:

public static bool UploadFileOnServer(string fileName, Uri serverUri) 
{ 
    // The URI described by serverUri should use the ftp:// scheme. 
    // It contains the name of the file on the server. 
    // Example: ftp://contoso.com/someFile.txt. 
    // The fileName parameter identifies the file 
    // to be uploaded to the server. 

    if (serverUri.Scheme != Uri.UriSchemeFtp) 
    { 
     return false; 
    } 
    // Get the object used to communicate with the server. 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri); 
    request.Method = WebRequestMethods.Ftp.UploadFile; 

    StreamReader sourceStream = new StreamReader(fileName); 
    byte [] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 
    sourceStream.Close(); 
    request.ContentLength = fileContents.Length; 

    // This example assumes the FTP site uses anonymous logon. 
    request.Credentials = new NetworkCredential ("anonymous","[email protected]"); 
    Stream requestStream = request.GetRequestStream(); 
    requestStream.Write(fileContents, 0, fileContents.Length); 
    requestStream.Close(); 
    FtpWebResponse response = (FtpWebResponse) request.GetResponse(); 

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

    response.Close(); 
    return true; 
} 
Смежные вопросы