BackgroundWorker e FtpWebRequest
lucaddr
lucaddr non è online. Ultima attività: 26/06/2009 9.46.55lucaddr
il 7 agosto 2008 alle 10.40
29 messaggi dal 17 settembre 2001
Ciao ragazzi,

ho un problemino con un piccolo client FTP per scaricarmi dei file da un FTP con ip pubblico.

Ho creato un backgroundworker e nel evento DoWork faccio:

foreach (object itemChecked in checkedListBox1.CheckedItems)
{
try
{
FtpWebRequest FtpRequest = (FtpWebRequest)WebRequest.Create("ftp://87.55.120.44/" + itemChecked.ToString());
FtpRequest.Credentials = new NetworkCredential("pippo", "pippo");
//FtpRequest.Proxy = GlobalProxySelection.GetEmptyWebProxy();
FtpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
FtpRequest.UseBinary = true;

FtpWebResponse FtpResponse = (FtpWebResponse)FtpRequest.GetResponse();
FileStream FileStream = new FileStream("C:\\Documents and Settings\\pippo\\Desktop\\FTP\\FTP\\bin\\Debug\\FTP\\" + itemChecked.ToString(), FileMode.Create, FileAccess.Write);
//Converto lo stram FTP in un oggetto standard Stream
Stream ResponseStream = FtpResponse.GetResponseStream();

long cl = FtpResponse.ContentLength;
int bufferSize = 2048;
byte[] buffer = new byte[bufferSize];
int readCount = ResponseStream.Read(buffer, 0, bufferSize);

while (readCount > 0)
{
for (int i = 0; i < 100; i++)
{
backgroundWorker1.ReportProgress(i);
FileStream.Write(buffer, 0, readCount);
readCount = ResponseStream.Read(buffer, 0, bufferSize);
}
}

//Chiudo gli oggetti
FileStream.Close();
ResponseStream.Close();
FtpResponse.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

Solamente che mi accorgo che il file o i file che seleziono vengono scaricati più volte...i byte nornano a zero e ricomincia la copia per una una o due volte. Poi si ferma e i file sono correttamente scaricati e utilizzabili...come mai?

Dove sbaglio?
Modificato da lucaddr il 07 agosto 2008 10.42 -

Luca.
RE: BackgroundWorker e FtpWebRequest
vladimiro
vladimiro non è online. Ultima attività: 14/03/2009 10.29.57vladimiro
il 7 agosto 2008 alle 14.11
Contributi | 438 messaggi dal 04 agosto 2002
cosi, a colpo d'occhio, hai provato a spostare quell'oggetto FileStream fuori dal ciclo for?

v

RE: BackgroundWorker e FtpWebRequest
lucaddr
lucaddr non è online. Ultima attività: 26/06/2009 9.46.55lucaddr
il 7 agosto 2008 alle 14.14
29 messaggi dal 17 settembre 2001
Eh si..

while (readCount > 0)
{
//for (int i = 0; i < 100; i++)
//{
//backgroundWorker1.ReportProgress(i);
FileStream.Write(buffer, 0, readCount);
readCount = ResponseStream.Read(buffer, 0, bufferSize);
//}
}

ma niente. Non capisco cosa influisce

Luca.
RE: BackgroundWorker e FtpWebRequest
vladimiro
vladimiro non è online. Ultima attività: 14/03/2009 10.29.57vladimiro
il 7 agosto 2008 alle 14.36
Contributi | 438 messaggi dal 04 agosto 2002
lucaddr ha scritto:
... ma niente. Non capisco cosa influisce


così, a colpo d'occhio, ... neppure io
se selezioni il download di un solo file, saltando in pratica il ciclo while più esterno, il problema si ripropone?

v

RE: BackgroundWorker e FtpWebRequest
lucaddr
lucaddr non è online. Ultima attività: 26/06/2009 9.46.55lucaddr
il 7 agosto 2008 alle 14.45
29 messaggi dal 17 settembre 2001
Porca miseria...

ho tolto il foreach ma nulla, mi ripete per due volte il ciclo di scittura del file...come se quando i bite vadano a 0 non si stoppa..

Luca.
RE: BackgroundWorker e FtpWebRequest
vladimiro
vladimiro non è online. Ultima attività: 14/03/2009 10.29.57vladimiro
il 7 agosto 2008 alle 15.30
Contributi | 438 messaggi dal 04 agosto 2002
Ora non ho vs sotto mano per fare un test; questa sera ci provo.
Se hai risolto prima tanto meglio ... però fai sapere, sono curioso ;)

v

RE: BackgroundWorker e FtpWebRequest
lucaddr
lucaddr non è online. Ultima attività: 26/06/2009 9.46.55lucaddr
il 7 agosto 2008 alle 15.32
29 messaggi dal 17 settembre 2001
Ok, ti ringrazio,

ci sto provando...

Luca.
RE: BackgroundWorker e FtpWebRequest
vladimiro
vladimiro non è online. Ultima attività: 14/03/2009 10.29.57vladimiro
il 7 agosto 2008 alle 18.49
Contributi | 438 messaggi dal 04 agosto 2002
io uso questo codice e non ho nessun problema:

Dim FtpRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx"), FtpWebRequest)
        FtpRequest.Credentials = New System.Net.NetworkCredential("pippo", "pippo")
        FtpRequest.KeepAlive = False
        FtpRequest.UseBinary = True
        FtpRequest.Method = System.Net.WebRequestMethods.Ftp.DownloadFile

        Using response As System.Net.FtpWebResponse = _
      CType(FtpRequest.GetResponse, System.Net.FtpWebResponse)
            Using responseStream As IO.Stream = response.GetResponseStream
                'loop to read & write to file
                Using fs As New IO.FileStream("C:\test,zip", IO.FileMode.Create)
                    Dim buffer(2047) As Byte
                    Dim read As Integer = 0
                    Do
                        read = responseStream.Read(buffer, 0, buffer.Length)
                        fs.Write(buffer, 0, read)
                    Loop Until read = 0
                    responseStream.Close()
                    fs.Flush()
                    fs.Close()
                End Using
                responseStream.Close()
            End Using
            response.Close()
        End Using


noto (almeno) due differenze:
il buffer a 2047 anzichè a 2048
il controllo sul read=0 nel loop

Sull'ultimo punto vedi la nota in quest'articolo:
http://www.codeproject.com/KB/IP/FtpClient.aspx

fammi sapere ...

v


2 pagine: [1] 2 Avanti >>

Vai a:
Torna al forum |   Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.

COMMUNITY
ULTIMI MESSAGGI
MEDIA
IN EVIDENZA
MISC
Powered by .db Forums "Caesar Reborn" v. 2009.6.9