FTP Server - TStream* zeigt auf nichts



  • procedure TForm1.IdFTPServer1StoreFile(ASender: TIdFTPServerContext;
      const AFileName: string; AAppend: Boolean; var VStream: TStream);
    begin
     if not Aappend then
       VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmCreate)
     else
       VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmOpenWrite)
    end;
    

    hab das im Delphi Forum gefunden, kann das jdm übersetzen ? bzw: Ist das nicht unsinnig, sieht aus als wenn er Datei 1 liest und in Datei 1 schreibt ??? AAAA, das ist ja nicht auf dem Selben rechner ! Ich glaub ich habs !

    EDIT: Ne also irgendwie sieht das unlogisch aus !



  • Tim06TR schrieb:

    audacia schrieb:

    Weil du VStream nie einen Wert zuweist?

    Das sollte eigentlich automatisch durch die IndyKomponente geschehen, die ja diese Funktion im Falle eines "Put(...)" aufruft.

    Steht das so in der Dokumentation? Ansonsten schau nocheinmal genauer hin. Das Event übergibt eine Referenz auf einen TStream-Zeiger. Das deutet darauf hin, daß du dem Zeiger einen Wert zuweisen, also selbst einen Stream bereitstellen sollst.

    Tim06TR schrieb:

    Ist das nicht unsinnig, sieht aus als wenn er Datei 1 liest und in Datei 1 schreibt ???

    -> Dokumentation zu fmCreate und fmOpenWrite konsultieren.



  • audacia schrieb:

    Tim06TR schrieb:

    Ist das nicht unsinnig, sieht aus als wenn er Datei 1 liest und in Datei 1 schreibt ???

    -> Dokumentation zu fmCreate und fmOpenWrite konsultieren.

    TFileStream.Create creates a new file if needed.
    Das andere nicht... öffnet nur zum schreiben.

    audacia schrieb:

    Das deutet darauf hin, daß du dem Zeiger einen Wert zuweisen, also selbst einen Stream bereitstellen sollst.

    Ok...

    Meine Frage: woher bekommt StoreFile die Information, die bytes, die Datei ?
    Aber ich werde mal basteln, ich hoffe inständig den FTP bis Freitag fertig zu kriegen. [EDIT: ZUM LAUFEN, und das ist kein hetzen, will keine falschen Assoziationen hervorrufen !]

    void __fastcall TForm1::ServerStoreFile(TIdFTPServerContext *ASender, const UnicodeString AFileName,
    		  bool AAppend, TStream *&VStream)
    {
    	TMemoryStream* Tfstr = new TMemoryStream;
    	VStream = Tfstr;
    	ASender->Server->FTPFileSystem->StoreFile(ASender,
    	AFileName,
    	AAppend,
    	VStream);
    	TStringStream* TStrStr = new TStringStream;
    	TStrStr->LoadFromStream(VStream);
    	TStrStr->SaveToFile("C:\\Text.txt");
    	delete Tfstr;
    	delete TStrStr;
    }
    //---------------------------------------------------------------------------
    

    Ist wahrscheinlich Nonsense was ich jetzt geändert habe.
    [Fehler bleibt ! Noch immmer AccViolation: ... Address: 00000000]
    2. Der Client hat auch beim Put eine nullptr Fehlermeldung.



  • Die letzten Zeilen des Logs:

    Recv 08.06.2010 14:56:53: 229 Entering Extended Passive Mode (|||20|)<EOL>
    Sent 08.06.2010 14:56:53: APPE file.dat<EOL>
    Recv 08.06.2010 14:56:54: 550 Zugriffsverletzung bei Adresse 0040204B in Modul 'FTestP.exe'. Lesen von Adresse 00000000<EOL>
    Sent 08.06.2010 14:56:57: QUIT<EOL>
    Recv 08.06.2010 14:56:57: 221 Goodbye.<EOL>
    Stat Disconnected.

    Ich nehme an das hilft wenig, aber wer weiß



  • Tim06TR schrieb:

    Meine Frage: woher bekommt StoreFile die Information, die bytes, die Datei ?

    Gar nicht - die gibt es dir ja. Du sollst ihm einen passenden Stream zurückgeben.

    Tim06TR schrieb:

    Ist wahrscheinlich Nonsense was ich jetzt geändert habe.

    Ja.

    Was du machen mußt, ist doch wunderbar ersichtlich an dem Delphi-Beispiel. Was gibts da nicht zu verstehen?



  • Ah ja richtig... [den hab ich VÖLLIG vergessen]

    VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmCreate)
    

    (Ist in Cpp völliger Unsinn)

    eigentlich würde ich TStream "Name" mit new erstellen und dann aus datei oder stream laden (wie bei StringStream), aber:
    1. TStream ist abstrakt
    2. Brauche Methode zum laden

    Was du machen mußt, ist doch wunderbar ersichtlich an dem Delphi-Beispiel. Was gibts da nicht zu verstehen?

    *hust* Delphi to C++ *hust*



  • Tim06TR schrieb:

    VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmCreate)
    

    (Ist in Cpp völliger Unsinn)

    Nö. In C++ sieht das fast genauso aus. " TFileStream.Create " ruft den TFileStream-Konstruktor auf, ist also analog zu " new TFileStream ". " := " wird in C++ zu " = ". Der Rest bleibt gleich.

    Tim06TR schrieb:

    *hust* Delphi to C++ *hust*

    Jeder C++Builder-Programmierer sollte Delphi-Quelltext zumindest lesen können. Auch gibts dazu jede Menge Tutorials im Netz. Es ist nur eine Frage des Engagements.



  • audacia schrieb:

    Tim06TR schrieb:

    VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmCreate)
    

    (Ist in Cpp völliger Unsinn)

    Nö. In C++ sieht das fast genauso aus. " TFileStream.Create " ruft den TFileStream-Konstruktor auf, ist also analog zu " new TFileStream ". " := " wird in C++ zu " = ". Der Rest bleibt gleich.

    Oh im Ernst ?

    EDIT: OH JA IM ERNST !

    Aber jetzt bin ich erst RICHTIG verwirrt, denn DER FEHLER BLEIBT ???

    (edit 2 hab delete vergessen)

    void __fastcall TForm1::ServerStoreFile(TIdFTPServerContext *ASender, const UnicodeString AFileName,
    		  bool AAppend, TStream *&VStream)
    {
    	if (AAppend)
    		VStream = new TFileStream(AFileName,fmCreate);
    	else
    		VStream = new TFileStream(AFileName,fmOpenWrite);
    	ASender->Server->FTPFileSystem->StoreFile(ASender,AFileName,AAppend,VStream);
         delete VStream;
    }
    //---------------------------------------------------------------------------
    

    edit 3: Moment gucke kurz im Debugger

    edit 4: VStream hat schon mal ne addresse
    Aber FTPFileSystem nicht ?
    http://i49.tinypic.com/mmy3ww.jpg

    edit 5: Server hat 00E3C000, klingt normal
    FTPFileSystem hat NULL ( 😮 )
    StoreFile siehe Bild



  • Tim06TR schrieb:

    ASender->Server->FTPFileSystem->StoreFile(ASender,AFileName,AAppend,VStream);
    delete VStream;

    Wo im Delphi-Quellcode stehen die Äquivalente zu diesen beiden Zeilen?



  • Nirgendwo ?
    ACHSO ! Die müssen raus. OK !
    Wenns jetzt funktioniert muss ich hier leider ein Großbuchstabenspam veranstalten.
    (*ironie aus*)

    ********* ******, ES FUNZT !

    audacia 👍 👍 👍

    Ungeahnte möglichkeiten tuen sich vor mir auf. (*sehr lauter Ausschrei der Freude und der Erleichterung* - 175 Dezibel)


Anmelden zum Antworten