Datenaustausch sichtbar machen per Progressbar

12/10/2007 - 10:37 von martina gerling | Report spam
Hallo,

ich hoffe das das Thema hier passt. Ich habe es hinbekommen, dass ich
einen Upload aus meiner Anwendung zum IIS machen kann. Das ganze
funktioniert halbwegs gut, manchmal kommen jedoch Fehler oder
Timeouts. Im großen und ganzen geht die Übertragung aber.

Ich übertrage Asynchron und habe hierzu eine Frage. Besteht die
Möglichkeit, dass die Dauer der Übertragung auch grafisch sichtbar
gemacht werden kann, z. B. mit der Progressbar?

Es würde mich auch interessieren, ob Ihr das ganze auch so
programmiert hàttet oder ob man den Code noch beser machen könnte wie
ich es gelöst habe?

Hier mal mein Code aus der Anwendung:
localhost.Service1 ful = new localhost.Service1();
delegate bool Uebertragen(string sname, byte[] barray, long groesse);
private void button2_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Uebertragen uebertragen = ful.SaveFileToServer;
try
{
if (openFileDialog1.FileName.Trim() != "")
{
FileStream fs = new FileStream(
openFileDialog1.FileName,
FileMode.Open,
FileAccess.Read);
long FileSize = fs.Length;
byte[] b = new byte[(int)FileSize];
fs.Read(b, 0, (int)FileSize);
fs.Close();

FileInfo fi = new
FileInfo(openFileDialog1.FileName);

string name = fi.Name;
long groesse = fi.Length;

IAsyncResult iaresult uebertragen.BeginInvoke(
"test\\otto\\herrmann\\" + name, b,
groesse,null,null);

while (!iaresult.IsCompleted)
{
Thread.Sleep(1000);
}

bool empfang uebertragen.EndInvoke(iaresult);

if (empfang)
{
MessageBox.Show("Datei ok");
}
else if (!empfang)
{
MessageBox.Show("Datei nicht ok" + "" );
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}


Der Code der WebMethode:
[WebMethod]
public bool SaveFileToServer(string sFileName, byte[]
bFileByte, long groesse)
{

string sDatei Path.Combine(Server.MapPath("~"),sFileName);
FileInfo fi = new FileInfo(sDatei);

if (fi.Exists && fi.Length == groesse)
{
return true;
}

try
{
if (!fi.Exists || fi.Length != groesse)
{
string[] datei = sFileName.Split(new Char[] { '\
\' });

string temp = Server.MapPath("~");

for (int i = 0; i < datei.Length - 1; i++)
{
temp += "\\" + datei[i];
if (!Directory.Exists(temp))
Directory.CreateDirectory(temp);

}

MemoryStream ms = new MemoryStream(bFileByte);
FileStream fs = new FileStream(sDatei,
FileMode.Create);
ms.WriteTo(fs);
ms.Close();
fs.Close();
}
}
catch (Exception ex)
{
return false;
}

FileInfo fi2 = new FileInfo(sDatei);

if (fi2.Exists && fi2.Length == groesse)
{
return true;
}
else
return false;
}
}

Gruß

Martina
 

Lesen sie die antworten

#1 Philipp Brune
12/10/2007 - 10:56 | Warnen spam
Hallo Martina,

ich befürchte fast, dass es sich schwierig gestaltet den Status des
Uploads (z.B. in %) festzustellen bzw. anzuzeigen, wenn Du die gesamte
Datei in ein byte [] einliest und dann "in einem Rutsch" an den Server
sendest. Vielleicht könnte man das lösen indem man die Datei
"Hàppchenweise" an den Server schickt.

Sonst hast Du das schon mit Bedacht gemacht finde ich aber eine
Kleinigkeit hàtte ich anders gelöst :

Busy Waiting wie
while (!iaresult.IsCompleted)
{
Thread.Sleep(1000);
}

ist nicht so schön. Ich hàtte BeginInvoke mit AsyncCallback
verwendet oder den gesamten Updload in einen eigenen Thread
gepackt. So blockiert die Benutzerschnittstelle auch nicht.

Schöne Grüße,
Philipp


martina gerling schrieb:
Hallo,

ich hoffe das das Thema hier passt. Ich habe es hinbekommen, dass ich
einen Upload aus meiner Anwendung zum IIS machen kann. Das ganze
funktioniert halbwegs gut, manchmal kommen jedoch Fehler oder
Timeouts. Im großen und ganzen geht die Übertragung aber.

Ich übertrage Asynchron und habe hierzu eine Frage. Besteht die
Möglichkeit, dass die Dauer der Übertragung auch grafisch sichtbar
gemacht werden kann, z. B. mit der Progressbar?

Es würde mich auch interessieren, ob Ihr das ganze auch so
programmiert hàttet oder ob man den Code noch beser machen könnte wie
ich es gelöst habe?

Hier mal mein Code aus der Anwendung:
localhost.Service1 ful = new localhost.Service1();
delegate bool Uebertragen(string sname, byte[] barray, long groesse);
private void button2_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Uebertragen uebertragen = ful.SaveFileToServer;
try
{
if (openFileDialog1.FileName.Trim() != "")
{
FileStream fs = new FileStream(
openFileDialog1.FileName,
FileMode.Open,
FileAccess.Read);
long FileSize = fs.Length;
byte[] b = new byte[(int)FileSize];
fs.Read(b, 0, (int)FileSize);
fs.Close();

FileInfo fi = new
FileInfo(openFileDialog1.FileName);

string name = fi.Name;
long groesse = fi.Length;

IAsyncResult iaresult > uebertragen.BeginInvoke(
"test\\otto\\herrmann\\" + name, b,
groesse,null,null);

while (!iaresult.IsCompleted)
{
Thread.Sleep(1000);
}

bool empfang > uebertragen.EndInvoke(iaresult);

if (empfang)
{
MessageBox.Show("Datei ok");
}
else if (!empfang)
{
MessageBox.Show("Datei nicht ok" + "" );
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}


Der Code der WebMethode:
[WebMethod]
public bool SaveFileToServer(string sFileName, byte[]
bFileByte, long groesse)
{

string sDatei > Path.Combine(Server.MapPath("~"),sFileName);
FileInfo fi = new FileInfo(sDatei);

if (fi.Exists && fi.Length == groesse)
{
return true;
}

try
{
if (!fi.Exists || fi.Length != groesse)
{
string[] datei = sFileName.Split(new Char[] { '\
\' });

string temp = Server.MapPath("~");

for (int i = 0; i < datei.Length - 1; i++)
{
temp += "\\" + datei[i];
if (!Directory.Exists(temp))
Directory.CreateDirectory(temp);

}

MemoryStream ms = new MemoryStream(bFileByte);
FileStream fs = new FileStream(sDatei,
FileMode.Create);
ms.WriteTo(fs);
ms.Close();
fs.Close();
}
}
catch (Exception ex)
{
return false;
}

FileInfo fi2 = new FileInfo(sDatei);

if (fi2.Exists && fi2.Length == groesse)
{
return true;
}
else
return false;
}
}

Gruß

Martina

Ähnliche fragen