Pobieranie duzych plików

0

Pisze program do pobierania plikow. Pliki pobieram w ten sposob:

// the URL to download the file from
            string sUrlToReadFileFrom = _dl;    
            // the path to write the file to
            Uri _uri = new Uri(_dl);
            string sFilePathToWriteFileTo = _path+Path.GetFileName(_uri.AbsolutePath);

            // first, we need to get the exact size (in bytes) of the file we are downloading    
            Uri url = new Uri(sUrlToReadFileFrom);    
            System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);    
            System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();    
            response.Close();    
            // gets the size of the file in bytes    
            Int64 iSize = response.ContentLength;

            // keeps track of the total bytes downloaded so we can update the progress bar    
            Int64 iRunningByteTotal = 0;

            // use the webclient object to download the file    
            using (System.Net.WebClient client = new System.Net.WebClient())
            {
                // open the file at the remote URL for reading        
                using (System.IO.Stream streamRemote = client.OpenRead(new Uri(sUrlToReadFileFrom)))
                {
                    // using the FileStream object, we can write the downloaded bytes to the file system            
                    using (Stream streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
                    {
                        // loop the stream and get the file into the byte buffer                
                        int iByteSize = 0;                
                        byte[] byteBuffer = new byte[iSize];
                        while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                        {
                            // write the bytes to the file system at the file path specified                    
                            streamLocal.Write(byteBuffer, 0, iByteSize);                    
                            iRunningByteTotal += iByteSize;                     
                            // calculate the progress out of a base "100"                    
                            double dIndex = (double)(iRunningByteTotal);                    
                            double dTotal = (double)byteBuffer.Length;                    
                            double dProgressPercentage = (dIndex / dTotal);                    
                            int iProgressPercentage = (int)(dProgressPercentage * 100);                     
                            
                            // update the progress bar                    
                            backgroundWorker1.ReportProgress(iProgressPercentage);
                        }
                        // clean up the file stream                
                        streamLocal.Close();
                    }
                    // close the connection to the remote server            
                    streamRemote.Close();
                }
            }

oczywiscie to nie caly kod ale najwzniejsza czesc pobierajaca plik z internetu. Program działa ale tylko dla plików nie wiekszych mniej wiecej 60mb przy probie pobrania pliku 70mb lub wiekszego pojawia sie taki komunikat w tym miejscu

iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length))

Unable to read data from the transport connection: Nie można przeprowadzić operacji na gnieździe, ponieważ w systemie brakuje miejsca na bufor lub ponieważ została zapełniona kolejka.

podobno można jakoś buffer limit zmienić ale nie mogłem znaleźć nigdzie konkretnego przykładu więc nie wiem co mam zrobić aby mozna bylo pobrać wieksze pliki tak jak robi to przeglądarka, ma ktos pojecie jak mozna rozwiązać ten problem?
thx

0

No jak tworzysz bufor wielkości pobieranego pliku to co się dziwisz. Utwórz mniejszy i pobierz dane parę razy, w mniejszych częściach.

0

jak tworze mniejszy buffer to i tak sie wysypuje po chwili

byte[] byteBuffer = new byte[655336];

jak mam pobrać je kilka razy? przeciez to juz jest w petli mam zmieniać w stream.Read offset ?
czy mam klika streamow utworzyc jakos i je potem polaczyc? da sie ten przyklad przerobic tak jak sugerujesz czy trzeba od nowa pisać funkcje pobierajaca?

0

Chwila na google i mamy taki przykladowy projekcik programu, ktory sciaga plik czesciami. na pewno znajdziesz tam rozwiazanie swojego problemu.

0

przekopac sie przez caly ten projekt aby znalezc funkcje pobierajaca to droga przez meke to zbyt rozbudowany projekt , poza tym po co pobierac segmentami jezeli mozna to zrobic w jednym z mniejszym bufferem (chyba) nie kazdy serwer pozwala na wiele jednoczesnych polaczen do danego pliku w moim kodzie na pewno niewiele trzeba zmienic zaby to dzialalo jak trzeba ale nie mam pomyslu samo zmniejszenie bufora nic nie zmienia niestety, znalazlem tez inny kod nawet podobny do mojego (wmiare) i pobiera duze pliki ale za nic nie moge skumac jakim cudem, przydalo by sie dobre wyjasnienie pobierania od podstaw bo inaczej nic sam nie zrobie a ten kod ktory zamiescilem to przyklad z neta ale to na pewno nie moze byc az tak trudne

1 użytkowników online, w tym zalogowanych: 0, gości: 1