Загрузка текстового поля в текстовый файл на FTP C # - PullRequest
0 голосов
/ 22 января 2010

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

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 (h);

Поток не был доступен для записи.

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 22 января 2010

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

Цитата:

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

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

5 голосов
/ 22 января 2010

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

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

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

Взято из 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","janeDoe@contoso.com");
    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;
}
...