Datei auf Server bearbeiten, Daten anfügen



  • Hallo an alle,

    ich versuche gerade mich etwas mit dem Thema Server vertraut zu machen...
    Ich habe eine Anwendung für ein Android Endgerät erstellt, mit der ich auf einen Server zugreif und Dateien an den Server schicke.

    ....
    //Zum aufbau der Verbindung
                      FTPClient->Host=Edit1->Text;
              FTPClient->Username=Edit2->Text;
              FTPClient->Password=Edit3->Text;
              FTPClient->Passive=true;
              FTPClient->Connect();
    ...
    //zum Übertragen der Dateien
    FTPClient->TransferType = ftBinary;
             FTPClient->Put("Form2->FTPDatei","test.txt") ;
             ShowMessage("Done!");
    ...
    

    Hier benutze ich eine Datei von meinem Handy und lege diese unter dem Namen test.txt auf dem Server neu an.

    Wie kann ich hinbekommen, eine bereits vorhandene Datei auf dem PC z.B. Dtest.txt zu beschreiben, sprich mit ios::app das ich nur einzelne daten an die Text-Datei schick und diese einfach an die Datei anhänge.

    Ich habe es zuerst so versucht, aber das kann nicht funktionieren.

    int var = 10;
          fstream File("d: \test.txt", ios::out|ios::app);
        if (File.is_open())
        {
             File << var << endl;
    
             File.close();
    }
    

    um mich kurz zu fassen,

    ich möchte z.B. "Hallo du da" in eine Bereits vorhandene Datei reinschreiben die hier liegt: d: \test.txt

    Hoffe mir kann jemand helfen.

    Beste Grüße
    berolld



  • Vermutlich lautet dein Dateiname "d:\test.txt" statt "d: \test.txt". Und wenn du das nach C++ übersetzt, musst du natürlich den Backslash quoten, da du mit \t sonst einen Tab bekommst.

    Also:

    fstream File("d:\\test.txt", ios::out|ios::app);
    

    Was hat das ganze jetzt irgendwie mit Client/Server bzw. ftp zu tun?!



  • Ich kann ja mit dem ersten Code eine Datei vom Handy auf dem Server anlegen.

    Mit dem zweiten Code, habe ich versuch, eine schon existierende Datei auf dem Server zu bearbeiten, sprich, einen Satz am ende anzuhängen.
    mit dem Code

    FTPClient->Put("dateiname.txt" , "test.txt");
    

    nehme ich eine Vorhandene datei vom Handy und speichere diese auf dem Ordner welcher im Serevr hinterlegt ist.

    Ich versuche jetzt, und das ist nur ein Beispiel wie ich es gerne machen möchte mit der richtigen Methode die ich dato nicht weiß,

    FTPClient->Put("dieser text soll rein", "d:\\test.txt");
    

    reinzuschreiben.



  • https://stackoverflow.com/questions/2536592/use-of-ftp-append-command

    -> du musst mal schauen, was dein ftp-Server so alles kann und welchen Weg du gehen willst.



  • Ich werde daraus nicht wirklich schlau.

    Ich benutze FileZilla....
    Eine *.txt-Datei auf den Server schicken funktioniert ja.
    Aber ist es möglich eine bestehende Datei zu bearbeiten schprich etwas anzuhänden?

    Mit

    fstream File("d: \test.txt", ios::out|ios::app);
    

    iso::app hängt man ja etwas am ende an, wass ich ja auch will.

    Wie kann ich herrausfinden ob mein FileZilla Server das kann? ich habe ja eingestellt read, write, delete, und append, all ich den Ordner erstellt habe.



  • Du verwechselst da lokale Filestreams und den FTP Stream.
    Dein (zu komplizierter) Ansatz holt erst die Textdatei lokal auf dein Handy, fügt eine Zeile hinzu und lädt sie dann wieder auf den FTP Server hoch.

    Dann ist es auch nicht die Frage, ob FileZilla das kann oder nicht, sondern welche API du für die Kommunikation benutzt, ob die das APPE Kommando unterstützt und wenn ja wie.

    Für mich sieht das nach den Indy Komponenten und Embarcadero RAD Studio aus. Die Komponente TidFTP bietet eine Überladung Methode Put an:

    void TIdFTP::Put( TIdStream* Source, String FileName, bool Append );
    

    Lösung:

    1. entsprechenden Stream erzeugen (TMemoryStream/TFileStream)
    2. Put aufrufen

    Edit:
    Typos und Grammatik



  • Ja es ist das Rad Studio 10.1 Berlin.

    Verstehe ich das richtig, das ich die Put Methode überschreiben muss??

    Da meines wissens nach, im Moment mit der Put methode nur eine vorhandene Datei an den Server geschickt werden kann?



  • berolld schrieb:

    Verstehe ich das richtig, das ich die Put Methode überschreiben muss??

    Da meines wissens nach, im Moment mit der Put methode nur eine vorhandene Datei an den Server geschickt werden kann?

    Nein. Es existiert bereits eine Überladung der Methode Put, um diese mit append zu nutzen.
    Du brauchst nur noch einen Stream des Typs TMemoryStream/TFileStream zu erstellen und diese überladene Methode

    DocShoe schrieb:

    void TIdFTP::Put( TIdStream* Source, String FileName, bool Append );
    

    verwenden.



  • Also ich habe mich mal durchgelesen.

    TFileStream erzeuge ich ja folgendermaßen:

    TFileStream *fStream = new TFileStream (c , ios::out| ios::app);
    //bzw.
    TFileStream *fStream = new TFileStream (c , fmOpenReadWrite);
    

    Unter c ist ja der Pfad gelegt, der geöffnet werden soll umd die Datei zu öffnen und reinzuschreiben.

    TMemoryStream dann so:

    TMemoryStream * mStream = new TMemoryStream();
    

    Mein mStream wird ja nur als temporärer Speicher genutzt, in die ich z.B. 2 Edits reinschreiben kann.
    Also z.B: Edit1 und Edit2

    Ich hoffe das ich auf dem Reichtigen weg bin, und weitere Tipps bekomme...



  • Damit keiner Denkt ich mache ncith und warte darauf das mir jemand die Antwort liefert, hab ich folgendes probiert:

    const char *fileContents = "Sein oder nicht sein, das ist hier die Frage.";
    const char *remoteFilename = "C:\\FTP\\test.txt";
    FTPClient->TransferType = ftASCII;
    FTPClient->Put(remoteFilename,fileContents, ios::app );
    

    Program führt aus aber sobald ich die sachen verschicke erhalte ich folgende Fehlermeldung:

    Datei C:\FTP\test.txt kann nicht geöffnet werden. Das System kann dan angegebenen Pfad nicht finden.



  • Ich seh da nirgendwo ein Stream Objekt,das du befüllst und an Put übergibst.
    Weniger raten oder probieren,mehr wissen was man tut.



  • Und der 'remoteFilename' kann auch nicht stimmen, denn FTP kennt keine Partitionen (und daher wohl auch die Fehlermeldung).



  • ...



  • DocShoe schrieb:

    Du verwechselst da lokale Filestreams und den FTP Stream.
    Dein (zu komplizierter) Ansatz holt erst die Textdatei lokal auf dein Handy, fügt eine Zeile hinzu und lädt sie dann wieder auf den FTP Server hoch.

    Dann ist es auch nicht die Frage, ob FileZilla das kann oder nicht, sondern welche API du für die Kommunikation benutzt, ob die das APPE Kommando unterstützt und wenn ja wie.

    Für mich sieht das nach den Indy Komponenten und Embarcadero RAD Studio aus. Die Komponente TidFTP bietet eine Überladung Methode Put an:

    void TIdFTP::Put( TIdStream* Source, String FileName, bool Append );
    

    Lösung:

    1. entsprechenden Stream erzeugen (TMemoryStream/TFileStream)
    2. Put aufrufen

    Edit:
    Typos und Grammatik

    Danke dir habe jetzt verstanden was du gemeint hast.
    Ich habe fstream und stream verwendet und siehe da es hat funktioniert....



  • berolld schrieb:

    Danke dir habe jetzt verstanden was du gemeint hast.
    Ich habe fstream und stream verwendet und siehe da es hat funktioniert....

    aber hauptsache erst mal flamen - nächstes mal denk zu erst nach und postest danach. sollte ja allgemein so sein; aber wenn man dann noch so nen post schreibt wie du (vor deinem edit), ists doppelt dämlich.


Anmelden zum Antworten