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 -
438 messaggi dal 04 agosto 2002
Contributi
cosi, a colpo d'occhio, hai provato a spostare quell'oggetto FileStream fuori dal ciclo for?

v
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
438 messaggi dal 04 agosto 2002
Contributi
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
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..
438 messaggi dal 04 agosto 2002
Contributi
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
29 messaggi dal 17 settembre 2001
Ok, ti ringrazio,

ci sto provando...
438 messaggi dal 04 agosto 2002
Contributi
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

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.