PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FTP Client: Nervende Exception



Armend100
27.11.2010, 11:26
Hallo, ich habe gestern schon was unnötiges gepostet aber jetzt habe ich wirklcih ein Problem.
schaut hier...


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

namespace ftpWinForms
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private byte[] downloadData;
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{


if (textBox1.Text == "suljica" && textBox2.Text == "keineahnungok")
{
button1.Enabled = false;
textBox1.Text = "";
textBox2.Text = "";
MessageBox.Show("Daten wurden akzeptiert, Verbindung zum Server wird hergestellt, bitte warten...", "Zugriff bestätigt", MessageBoxButtons.OK, MessageBoxIcon.Information);
FtpWebRequest HIT = FtpWebRequest.Create("ftp://rapidmind.99k.org/") as FtpWebRequest;
HIT.Credentials = new NetworkCredential("rapidmind_99k", "Ke1neahnungok@@"); //{UserName = "versteckt", Password = "versteckt" };

HIT.Method = WebRequestMethods.Ftp.ListDirectory;
HIT.UsePassive = true;
HIT.UseBinary = true;
HIT.KeepAlive = true;

FtpWebResponse Response = HIT.GetResponse() as FtpWebResponse;
Stream responseStream = Response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream);

while (!sr.EndOfStream)
{
listBox1.Items.Add(sr.ReadLine());
Application.DoEvents();
}

Response.Close();
responseStream.Close();
for (int i = 0; i <= 1; i++)
{
listBox1.Items.RemoveAt(i);
}
}
else
{
MessageBox.Show("Benutzername oder Passwort falsch", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void button2_Click(object sender, EventArgs e)
{
string Datei = listBox1.SelectedItem.ToString();
if (Datei == "..")
{
MessageBox.Show("Dies ist bloß eine FTP Datei und kann nicht heruntergeladen werden", "FTP", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
downloadData = new byte[0];
FtpWebRequest HIT = FtpWebRequest.Create("ftp://rapidmind.99k.org/" + Datei) as FtpWebRequest;
HIT.Method = WebRequestMethods.Ftp.DownloadFile;
HIT.Credentials = new NetworkCredential{UserName = "versteckt", Password = "versteckt" };
HIT.UsePassive = true;
HIT.UseBinary = true;
HIT.KeepAlive = false;
FtpWebResponse Response = HIT.GetResponse() as FtpWebResponse;
Stream reader = Response.GetResponseStream();
MemoryStream memSream = new MemoryStream();
byte[] buffer = new byte[1024];
int ByteRead;
while (true)
{
ByteRead = reader.Read(buffer, 0, buffer.Length);

if (ByteRead == 0)
{
break;
}
else
{
memSream.Write(buffer, 0, ByteRead);
}
reader.Close();
memSream.Close();
Response.Close();


}
downloadData = memSream.ToArray();
}
}
}
}


Ich krieg folgende Exception:
Auf das verworfende Objekt kann nicht zugegriffen werden,.
Objektname: "System.Net.Sockets.Network.Stream".

Jury
27.11.2010, 11:29
Das ist unlesbar. Setz es mal in Codetags oder formatier es vernünftig. Da bekommt man ja Augenkrebs bei...

Armend100
27.11.2010, 11:46
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

namespace ftpWinForms
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private byte[] downloadData;
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{


if (textBox1.Text == "suljica" && textBox2.Text == "keineahnungok")
{
button1.Enabled = false;
textBox1.Text = "";
textBox2.Text = "";
MessageBox.Show("Daten wurden akzeptiert, Verbindung zum Server wird hergestellt, bitte warten...", "Zugriff bestätigt", MessageBoxButtons.OK, MessageBoxIcon.Information);
FtpWebRequest HIT = FtpWebRequest.Create("ftp://rapidmind.99k.org/") as FtpWebRequest;
HIT.Credentials = new NetworkCredential("hidden", "hidden"); //{UserName = "hidden", Password = "hidden" };

HIT.Method = WebRequestMethods.Ftp.ListDirectory;
HIT.UsePassive = true;
HIT.UseBinary = true;
HIT.KeepAlive = true;

yFtpWebResponse Response = HIT.GetResponse() as FtpWebResponse;
Stream responseStream = Response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream);

while (!sr.EndOfStream)
{
listBox1.Items.Add(sr.ReadLine());
Application.DoEvents();
}

Response.Close();
responseStream.Close();
for (int i = 0; i <= 1; i++)
{
listBox1.Items.RemoveAt(i);
}
}
else
{
MessageBox.Show("Benutzername oder Passwort falsch", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void button2_Click(object sender, EventArgs e)
{
string Datei = listBox1.SelectedItem.ToString();
if (Datei == "..")
{
MessageBox.Show("Dies ist bloß eine FTP Datei und kann nicht heruntergeladen werden", "FTP", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
downloadData = new byte[0];
FtpWebRequest HIT = FtpWebRequest.Create("ftp://rapidmind.99k.org/" + Datei) as FtpWebRequest;
HIT.Method = WebRequestMethods.Ftp.DownloadFile;
HIT.Credentials = new NetworkCredential("hidden", "hidden"); //{UserName = "hidden", Password = "hidden" };
HIT.UsePassive = true;
HIT.UseBinary = true;
HIT.KeepAlive = false;
FtpWebResponse Response = HIT.GetResponse() as FtpWebResponse;
Stream reader = Response.GetResponseStream();
MemoryStream memSream = new MemoryStream();
byte[] buffer = new byte[1024];
int ByteRead;
while (true)
{
ByteRead = reader.Read(buffer, 0, buffer.Length);

if (ByteRead == 0)
{
break;
}
else
{
memSream.Write(buffer, 0, ByteRead);
}
reader.Close();
memSream.Close();
Response.Close();


}
downloadData = memSream.ToArray();
}
}
}
}
Also ich bekomme die Exception die oben erwähnt wurde.

The_Funeral
30.11.2010, 15:12
Verständlich...

Du schließt in deiner Schleife alle aktiven/offenen Verbindungen, versucht aber beim nächsten Schleifendurchlauf direkt wieder rein zuschreiben.



// ...
while (true)
{
ByteRead = reader.Read(buffer, 0, buffer.Length);

if (ByteRead == 0)
{
break;
}
else
{
memSream.Write(buffer, 0, ByteRead);
}
reader.Close();
memSream.Close();
Response.Close();


}
// ...
downloadData = memSream.ToArray();





...

while (true)
{
ByteRead = reader.Read(buffer, 0, buffer.Length);

if (ByteRead == 0)
{
break;
}
else
{
memSream.Write(buffer, 0, ByteRead);
}
}
downloadData = memSream.ToArray();
reader.Close();
memSream.Close();
Response.Close();
...

Generell versteh ich nicht ganz, weshalb du es so machst, wie du es machst...
Wenn du mehre Files hintereinander downloaden willst, wirst du vermutlich auch noch andere Probleme bekommen.

Du kannst dir ja mal dieses Beispiel von Microsoft anschauen:How to: Download Files with FTP (http://msdn.microsoft.com/en-us/library/ms229711.aspx)