Witam,
piszę aplikację która przesyła przez sieć między innymi pliki i mam z tym pewien problem/pytanie. Czy da się (a jeżeli tak to jak) "załadować" plik bezpośrednio do strumienia ? czy muszę go kolejno odczytywać do bufora i dane z bufora wpisywać do strumienia? podejrzewam że jednak jest jakiś prostszy sposób aby to zrobić...
Masz do dyspozycji takie klasy jak TStream, TFileStream czy TMemoryStream; Pierwsza klasa potrafi odczytywać dane z bufora i do niego zapisywać, druga odczytuje z pliku i do niego zapisuje, a ostatnia potrafi różne rzeczy, między innymi posiada metodę LoadFromStream oraz LoadFromFile - ta druga bardziej się przyda;
Klasy opisane powyżej istnieją w Borland Delphi 7, tak że na pewno w .NET ich nie zabrakło;
wiem że można do TMemoryStream tak załadować plik tylko nie potrafię go potem "przekopiować" do strumienia którym przesyłam dane - (System.IO.Stream).
ehhhh może pokażę procedurkę w której jest dzura taka jak w mojej głowie teraz ;(
procedure TRamkaPlik.ZapiszDane(aStr: Stream);
var
xmlwr: XmlWriter;
begin
inherited;
xmlwr := XmlTextWriter.Create(aStr, System.Text.Encoding.UTF8);
xmlwr.WriteStartElement('plik');
// WIELKA CZARNA DZIURA
xmlwr.WriteEndElement;//plik
end;
Gdyby klasa Stream miała procedurę LoadFromFile to nie było by problemu... może po prostu mam już dość na dzisiaj...
tom_85 napisał(a)
Gdyby klasa Stream miała procedurę LoadFromFile to nie było by problemu...
Nie ma co kombinować, lepiej napisać własną w oparciu o pliki amorficzne i procedury BlockRead i BlockWrite; Wiele wolniej to nie będzie działać a przynajmniej będziesz wiedział jak działa; Kod takiej procedury nie będzie zajmował więcej jak 50 linii więc śmiało można taki napisać własnoręcznie;
Zawsze możesz utworzyć strumień pomocniczy (np. z klasy TMemoryStream), do którego wczytasz dane z pliku a następnie wykonasz kopiowanie do właściwego strumienia; Według mnie nie ma sensu tak kombinować - lepiej mieć jeden strumień i napisać ręcznie wczytywanie pliku od razu do niego;
Tok rozumowania @furious programming: "po co skorzystać z dostępnych API, których nie znam, skoro mogę wszystko napisać sam od zera".
@tom_85: Klasa Stream
nie ma metody LoadFromFile, bo sam strumień jest niezależny od typu swojego źródła. Nie musi go znać, więc się nim nie przejmuje. Chcesz utworzyć strumień z pliku? To użyj klasy File
.
http://msdn.microsoft.com/en-us/library/system.io.file.openread