Probleem bij het downloaden van grote bestanden via WebClient/FTP

I'm currently building an application that is, among other things, going to download large files from a FTP server. Everything works fine for small files (< 50 MB) but the files I'm downloading are way bigger, mainly over 2 GB.

Ik heb met een Webclient geprobeerd met behulp van DownloadfileAsync() en een lijstsysteem toen ik deze bestanden na elkaar downloadte vanwege hun grootte.

DownloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress);
DownloadClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);

private void FileDownload()
{
    DownloadClient.DownloadFileAsync(new Uri(@"ftp://" + RemoteAddress + FilesToDownload[0]), LocalDirectory + FilesToDownload[0]));
}

private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
   //Handle progress
}

private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
    FilesToDownload.RemoveAt(0);
    FileDownload();
}

Het werkt op deze manier prima op kleine bestanden, ze worden allemaal één voor één gedownload, de voortgang wordt gerapporteerd en Download voltooid> wordt geactiveerd na elk bestand. Dit probleem dat ik tegenkom met grote bestanden is dat het de eerste download start zonder problemen, maar daarna niets doet. De gebeurtenis Voltooid downloaden vuurt nooit om een ​​of andere reden. Het lijkt erop dat de WebClient niet weet dat het bestand klaar is om te downloaden, wat een probleem is omdat ik dit evenement gebruik om de volgende download in de lijst FilesToDownload te starten.

Ik heb ook geprobeerd om dat synchroon te doen met behulp van WebClient.DownloadFile en een voor lus om door mijn FilesToDownload lijst te bladeren. Het downloadt het eerste bestand correct en ik krijg een uitzondering wanneer de tweede download moet starten: "De onderliggende verbinding is gesloten: er is een onverwachte fout opgetreden bij een ontvangst".

Ten slotte heb ik geprobeerd dit via FTP te doorlopen met behulp van edtFTPnet maar ik ' m geconfronteerd met problemen met de downloadsnelheid (dwz mijn download gaat op volle snelheid met de WebClient en ik krijg net 1/3 van de volledige snelheid met de edtFTPnet-bibliotheek).

Wat denk jij? Ik moet toegeven dat ik hier bijna geen ideeën meer heb.

3
Probeer een filestream of een MemoryStream te maken om dit te doen door de bytes te krijgen en wanneer u "large" zegt, wat is uw definitie van groot in verwijzing naar GIGS of MB's
toegevoegd de auteur MethodMan, de bron
onthoud besturingssysteem bestrijkt bestandsgroottes van 2 gig maar 4 gig limiet zijn als je .NET 4.0 gebruikt Microsoft Veranderde de limiet voor de bestandsgrootte in .NET 4.0 zodat je je integroottes moet veranderen in longs of Int64 type kun je de exact voorbeeld dat u gebruikt .. ook gegevensreeksen zullen altijd langer duren. Houd rekening met swap-bestanden en tmp-bestanden. Het is niet alleen een rechte kopie, je moet de beschikbare opslagruimte op de doelmedia hebben
toegevoegd de auteur MethodMan, de bron
Mijn grootste bestanden zijn meer dan 2 optredens.
toegevoegd de auteur Xeaz, de bron

2 antwoord

public string GetRequest(Uri uri, int timeoutMilliseconds)
{
     var request = System.Net.WebRequest.Create(uri);
     request.Timeout = timeoutMilliseconds;
     using (var response = request.GetResponse())
     using (var stream = response.GetResponseStream())
     using (var reader = new System.IO.StreamReader(stream))
     {
         return reader.ReadToEnd();
     }
 } 
0
toegevoegd

Vergeten om deze thread bij te werken, maar ik dacht al een tijdje geleden hoe dit uit te zoeken.

Het probleem was dat de gegevensverbinding die wordt geopend voor een bestandsoverdracht willekeurig wordt uitgezet om een ​​bepaalde reden of wordt afgesloten door de server voordat de overdracht eindigt. Ik heb niet kunnen achterhalen waarom, omdat er een lading lokale en externe netwerkinterfaces is tussen mijn computer en de externe server. Omdat het volledig willekeurig is (dat wil zeggen dat de overdracht prima werkt voor vijf bestanden achter elkaar, time-outs voor één bestand, werkt het goed voor de volgende bestanden, enz.), Is het probleem mogelijk gerelateerd aan de server of het netwerk.

Ik vang nu een FTP-uitzondering die door het FTP-clientobject tijdens het downloaden wordt veroorzaakt en geef een REST-opdracht op met een offset gelijk aan de positie in de gegevensstroom waar de overdracht is gestopt (dwz het totale bytebedrag van het externe bestand - momenteel gedownloade bytes bedrag). Als u dit doet, kunnen de overblijvende bytes worden opgehaald die ontbreken in het lokale bestand.

0
toegevoegd