Progress w wysyłaniu bytes array

0

Korzystam mniej więcej z takiego kodu do wysyłania tablicy bajtów na serwer ftp z progressem:

            byte[] buffer = ...;
            using (Stream ftpStream = ftp.GetRequestStream())
            {
                int allSended = 0;
                do
                {
                    ftpStream.Write(buffer, allSended, 100);
                    allSended += 100;
                }
                while (allSended < buffer.Length);
            }
 

Pytanie co zrobić, aby móc w ten sposób wysyłać pliki większe niż pojemność int bajtów? Stream.Write przyjmuje jako parametry int, a ten 'zmieści w sobie' bodajże 2GB.

0

Może należy w obiekcie FtopWebRequest ustawić Method na WebRequestMethods.Ftp.AppendFile i wysłać dalsze bajty?

0

przecież to i tak powinno zadziałać. nie odczytujesz do pamięci całego pliku i nie wysyłasz całego bufora naraz. odczytujesz plik po kawałku i po kawałku go wysyłasz, wtedy nie ma znaczenia, czy plik mieści się w jednym malutkim buforze, czy w ich miliardzie. Stream.Write jako int przyjmuje offset w BUFORZE, czyli podajesz tam 0, a count jest ilością odczytanych do bufora bajtów, która to ilość powinna się zmieścić w short, a co dopiero w int.

BTW "allSent", a nie "allSended".

0

long allSent = 0, myślałem, że to oczywiste, skoro sam deklarujesz typ tej zmiennej i sam stwierdzasz, że jest za mały.

1 parametr to mój wysyłany plik, 2 to miejsce od którego aktualnie go wczytamy i wyślemy (...) Czy wystarczy int na drugi parametr?
specjalnie kapitalikami napisałem "offset w BUFORZE, czyli podajesz tam 0", ale chyba masz drobne problemy z czytaniem ze zrozumieniem. OFFSET W BUFORZE. w pętli czytasz do bufora. bufor za każdym razem zawiera kolejną porcję danych z pliku, począwszy od zerowego indeksu, skończywszy na długości bufora-1 lub ilości przeczytanych bajtów, zależy co mniejsze. ponieważ dane w buforze rozpoczynają się na samym jego początku, a sam początek ma indeks 0, to metodzie Write() podajesz 0 (ZERO) jako drugi parametr. innymi słowy parametr ten oznacza, od którego indeksu w buforze znajdują się dane, które trzeba zapisać. może taka "graficzka" będzie pomocna:
plik zawiera takie dane [0,1,2,3,4,5,6,7,8,9]
bufor ma rozmiar 4, po pierwszym odczytaniu masz [0,1,2,3], ilośćPrzeczytanychDanych = 4
zapisujesz Write([0,1,2,3], 0, ilośćPrzeczytanychDanych);
bufor ma rozmiar 4, po drugim odczytaniu masz [4,5,6,7], ilośćPrzeczytanychDanych = 4
zapisujesz Write([4,5,6,7], 0, ilośćPrzeczytanychDanych);
bufor ma rozmiar 4, po trzecim odczytaniu masz [8,9,6,7], ilośćPrzeczytanychDanych = 2
zapisujesz Write([8,9,6,7], 0, ilośćPrzeczytanychDanych);
ilośćPrzeczytanychDanych < rozmiar bufora, dziękuję, wychodzę.

w Twojej wersji:
plik zawiera takie dane [0,1,2,3,4,5,6,7,8,9]
bufor ma rozmiar 4, po pierwszym odczytaniu masz [0,1,2,3], ilośćPrzeczytanychDanych = 4
zapisujesz Write([0,1,2,3], 0, ilośćPrzeczytanychDanych);
bufor ma rozmiar 4, po drugim odczytaniu masz [4,5,6,7], ilośćPrzeczytanychDanych = 4
zapisujesz Write([4,5,6,7], 3, ilośćPrzeczytanychDanych);
w tym momencie leci wyjątek, bo bufor jest krótszy niż offset + ilość danych, robisz wielkie oczy i pytasz na forum, dlaczego tak.

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