Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Streams!

Îåêßíçóå áðü ôï ìÝëïò JohnL. Τελευταία δημοσίευση από το μέλος JohnL στις 24-04-2008, 01:12. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-04-2008, 03:34 41683

    Streams!

    Θέλω να κάνω download ένα αρχείο από το internet χρησιμοποιώντας το HttpWebRequest και να το γράφω binary στο δίσκο....

    Το σημείο στο οποίο κολλάω είναι το πώς θα περάσω το HttpWebRequest.GetResponseStream() σε ένα Byte Array ή σε ένα Memory Stream π.χ.

    Φτάνω μέχρι και το StreamReader αλλά δεν ξέρω αν το χρειάζομαι....

    Λίγη βοήθεια???
    Δημοσίευση στην κατηγορία: ,
  •  23-04-2008, 10:35 41686 σε απάντηση της 41683

    Απ: Streams!

    Ο τρόπος που λειτουργούν τα stream φαίνεται όντως λίγο περίεργος αν δεν έχεις ασχοληθεί ποτέ, αλλά είναι ο πιο αποδοτικός τρόπος για να γίνει μια τέτοια δουλειά.

    Αφού πάρεις το StreamReader από το web request, πρέπει να ανοίξεις ένα FileStream. Θα διαβάζεις δεδομένα από το πρώτο σε chunks (πακέτα) και θα τα γράφεις στο δεύτερο. Έτσι μπορείς να κατεβάσεις τεράστια αρχεία χωρίς να χρειάζεται να τα φορτώσεις στη μνήμη ολόκληρα και μετά να τα γράψεις σε αρχείο. Οπότε το MemoryStream είναι εφικτή λύση αλλά δεν συστήνεται γι αυτή τη δουλειά.

    Οπότε κάνεις ένα byte array μικρού σχετικά μήκους π.χ. 1024 (1KB) και διαβάζεις με την Read από το StreamReader. Στη συνέχεια γράφεις αυτό το array χρησιμοποιώντας την Write του FileStream.

    Προσοχή! Πρέπει πάντα να παίρνεις και το return value της Read που επιστρέφει πόσα bytes διαβάστηκαν τελικά. Μπορείς εσύ να του λες να διαβάσει 1024, αλλά στο τέλος του αρχείου θα διαβάσει ότι περισσέψει. Οπότε όταν γράφεις στο FileStream δεν πρέπει να γράφεις όλο το byte array, αλλά έως το σημείο που έγραψε η Read του StreamReader.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  23-04-2008, 11:07 41688 σε απάντηση της 41683

    Απ: Streams!

    Φαντάζομαι ότι θες κάτι σαν το παρακάτω:

     

    using System.Net;
    using System.IO;

    public void TestMe()
    {
    WebRequest myWebRequest = WebRequest.Create("http://www.google.com/intl/en_ALL/images/logo.gif");
    WebResponse myWebResponse = myWebRequest.GetResponse();
    Stream receiveStream = myWebResponse.GetResponseStream();
    //Open filestream for writing operation
    FileStream fs = new FileStream(@"C:\logo.gif", FileMode.Create);
    //byte buffer of 1024 bytes
    Byte[] read = new Byte[1024];
    int count;
    while ((count = receiveStream.Read(read, 0, 1024)) > 0)
    {
    fs.Write(read,0,count);
    }
    //Close streams
    fs.Close();
    receiveStream.Close();
    }

    oops, χάθηκε το indentation του κώδικα αλλά φαντάζομαι θα βγάλεις άκρη...

  •  23-04-2008, 11:20 41689 σε απάντηση της 41688

    Απ: Streams!

    Εξαιρετικός κώδικας! ... έστω και χωρίς το indentation Big Smile

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  24-04-2008, 00:25 41702 σε απάντηση της 41689

    Απ: Streams!

    Ευχαριστώ πολύ!

    Επειδή θέλω όμως να διαβάσω το Stream δύο φορές, δε θα έπρεπε να χρησιμοποιήσω αντί για FileStream, ένα ενδιάμεσο MemoryStream? Ή γίνεται και αλλιώς?


    BTW. Δημήτρη πολύ ενδιαφέρουσα παρουσίαση σήμερα στη Microsoft για τα Mobile! Thank you!
  •  24-04-2008, 00:38 41703 σε απάντηση της 41702

    Απ: Streams!

    Χαίρομαι που σου άρεσε η παρουσίαση! 

    Κατά τα άλλα, ο κώδικας που θέλεις είναι ακριβώς αυτός που φαίνεται παραπάνω. Δοκίμασέ τον.

    Γιατί να διαβάσεις το stream δυο φορές; Διαβάζεις μια από το network stream και βάζεις αυτά που διαβάζεις στο byte array και μετά το byte array το "γράφεις" στο FileStream.
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  24-04-2008, 00:50 41704 σε απάντηση της 41703

    Απ: Streams!

    Χρησιμοποιώ την Image.FromStream(stream) για να ελέγξω κάποιες παραμέτρους της εικόνας και μόνο αν αυτές είναι σωστές τη γράφω στο δίσκο.

    Επειδή όμως το stream έχει φτάσει στο τέλος (λόγω της FromStream), πρέπει να το γυρίσω στην αρχή, κάτι που δε γίνεται καθώς τα ConnectStreams δεν υποστηρίζουν Seek!



    Επίσης, από πλευράς ταχύτητας γίνεται κάτι καλύτερο? Σε σχεση με την Image.Save() είναι σημαντικά πιο αργή...
  •  24-04-2008, 01:01 41705 σε απάντηση της 41704

    Απ: Streams!

    Η ερώτησή σου ήταν η εξής:

    JohnL:
    Θέλω να κάνω download ένα αρχείο από το internet χρησιμοποιώντας το HttpWebRequest και να το γράφω binary στο δίσκο....

    Τώρα την αλλάζεις! Εννοείται ότι τότε πρέπει να χρησιμοποιήσεις MemoryStream. Και μετά το MemoryStream θα το γράψεις πάλι σε κομμάτια στο FileStream, αφού κάνεις τον έλεγχο που θέλεις.

    Απο πλευράς ταχύτητας, άλλο είναι να κατεβάζεις ένα αρχείο από ένα network stream και άλλο να κάνεις Image.Save. Φυσικά το 2ο είναι πιο γρήγορο. 


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  24-04-2008, 01:12 41706 σε απάντηση της 41705

    Απ: Streams!

    OK έχεις δίκιο. Απλά δεν θυμόμουν ακριβώς τι είχα γράψει στην αρχή! Smile

    Όσον αφορά την ταχύτητα συνέκρινα τον παραπάνω αλγόριθμο με το Image.Save μόνο, με τη μεταφορά του αρχείου να υπάρχει και στα δύο ίδια. Αλλά μάλλον ήταν η εντύπωσή μου...

    Τελικά επέλεξα να το κατεβάζω απλά 2η φορά, γιατι είναι πολύ λίγες οι εικόνες που θέλουν αποθήκευση, και νομίζω ότι θα καθυστερούσε με τις άπειρες μεταφορές σε MemoryStream...
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems