Problem beim erstellen eines Filestreams



  • Hi,
    ich wollte mal nen bisschen mit den Filestreams rumspielen, hab mir also Hilfe angeschaut und so.
    Hab auch nen Stream zum Einlesen problemlos erstellen können:

    TFileStream* readfile = new TFileStream(filename,MAKEWORD(fmOpenRead,fmShareDenyWrite));
    

    Allerdings komme ich mit nem Stream zum schreiben nicht so recht klar:

    TFileStream* writefile = new TFileStream(".\\"+recv_filename,MAKEWORD(fmCreate,fmShareExclusive));
    

    Da wirft er mir zur Laufzeit immer ne Exception.
    Ich klär noch schnell die Variablen zur besseren Übersicht:
    filename ist eine kommplette Pfadangabe, also z.B. C:\dokumente\streamsmachenprobleme.pdf

    recv_filename ist nur ein Dateiname, also z.B. streamsmachenprobleme.pdf

    Mehr ungeklärte Variablen dürften in dem kleinen Codezeilchen nicht zu finden sein.

    Hoffe ihr könnt meinen Fehler finden.

    THX!

    edit: hab grad noch weiter getestet, auch wenn ich am writestream ne absolute Pfadangabe verwende (die für mich aber eh ungeeignet wäre) wirft er die exception.



  • Wenn dann würde ich solche Versuche mit dem Standard C++ (STL ifstream,ofstream) machen. Das geht ganz sicher und funktioniert auch noch wenn die VCL ausgestorben ist.



  • ja, nur das die ja zu dem ganzen VCL kram inkompatibel sind, d.h. keine AnsiStrings usw. (zumindest hab ichs nit hinbekommen).
    Sonst hätte ich auch die verwendet.

    btw. irgendwie würde mich jetzt aber trotzdem interessieren was ich bei diesen Streams falsch gemacht habe, weil gehn muss es ja trotzdem.

    Gruß
    Auron



  • Auron_X schrieb:

    Da wirft er mir zur Laufzeit immer ne Exception.

    Komplette Meldung?



  • tjo, das ursprüngliche Problem war nciht korrekt ermittelt worden und lag woanders, aber jetzt habe ich nen weiteres Problem auf den writestream eingrenzen können, fehlermeldung is nicht so recht erkennbar.
    Ich hab nen vollständig grauen Bildschirm und am rechten unteren Bildschirmbereich lässt sich nen zahlen/buchstabensalat und darunter das wort stream (ich seh nur tream) erahnen.
    Ziemlich komisch, das exceptionfenster kommt nicht.
    Wollt ihr nen Screenshot?
    Ich konnte das Problem auf diesen Bereich eingrenzen können:

    TFileStream* writefile = new TFileStream(".\\incoming\\"+recv_filename, fmCreate|fmShareExclusive);
      writefile->Seek(0,soFromEnd);
      writefile->WriteBuffer(content.c_str(),content.Length());
      delete writefile;
    

    kurze erläuterung:
    content = daten die geschrieben werden sollen

    anfangs meinte er er könne die datei nciht erstellen, also hab ich ne abfrage eingebaut die prüft ob das Verz. incoming bereits existiert und es andersfalls erstellt.

    Gruß
    Auron



  • Auron_X schrieb:

    Wollt ihr nen Screenshot?

    Aus deiner Beschreibung werde ich jedenfalls nicht schlau. 😉
    Wann bzw. wo genau tritt das Problem denn auf?



  • ich weiß es zwar nicht aber probier mal nur einen Modus beim erstellen der Datei mitzugeben.

    Also zuerst mit fmCreate und danach (bei einem 2. Objekt) dann mit (fmOpenWrite|fmShareXXX).

    TFileStream *creator = new TFileStream(fileName, fmCreate);
      delete creator;
    
      TFileStream *writer = new TFileStream(fileName, fmOpenWrite|fmShareXXX);
    
      // do something
    
      delete writer;
    

    ich hoffe das hilft

    cu Errraddicator



  • Folgendes Beispiel schreibt den Inhalt eines TMemos in eine Datei:

    AnsiString asFileNameAndPath = asFilePath + asFileName;
    	TFileStream* myfs = NULL;
    	char* myfsbuf = NULL;
    	int iBufSize;
    	try
    	{
    		try
    		{
    			myfsbuf = Memo1->Lines->GetText();
    			myfsbuf = asTemp.c_str();
    			iBufSize = strlen(myfsbuf);
    			myfs = new TFileStream(asFileNameAndPath, fmCreate|fmShareExclusive);
    			if (myfs)
    			{
    				myfs->Position = 0;
    				myfs->Write((void*) myfsbuf, iBufSize);
    			}
    		}
    		catch(...)
    		{
    			ShowMessage("Fehler beim Schreiben der Datei.");
    		}
    	}
    	__finally
    	{
    		if (myfs)
    			delete myfs;
    	}
    

    Es muß nicht explizit überprüft ob die Datei existiert oder nicht, respektive die Datei muß nicht explizit erstellt werden. Sollte die Datei bereits existieren, wird sie bei fmCreate im Schreibmodus geöffnet. Das gilt nicht, wenn das Verzeichnis nicht existiert!



  • @Jansen: ich werde aus dieser Fehlermeldung (klick mich!) nicht schlau ^^
    also es tritt in diesem Codeabschnitt auf:

    TFileStream* writefile = new TFileStream(".\\incoming\\"+recv_filename, fmCreate|fmShareExclusive);
      writefile->Seek(0,soFromEnd);
      writefile->WriteBuffer(content.c_str(),content.Length());
      delete writefile;
    

    @alleanderen: thx, ich werds mal probieren.



  • Auron_X schrieb:

    @Jansen: ich werde aus dieser Fehlermeldung (klick mich!) nicht schlau

    Hmm, sowas habe ich noch nie gesehen. Das bedeckt den ganzen Bildschirm?
    Könntest du ggf. mal ein kleines Beispielprojekt bereitstellen (mit fertiger Exe), das dieses Verhalten zeigt?

    Auf Verdacht würde ich sagen, dass entweder an deiner BCB-Installation oder am Windows-System etwas faul ist. Hast du das Programm mal auf einem anderen Rechner getestet?



  • also ich vermute, dass es vom BCB kommt, also zumindest nicht direkt von meinem Programm, wenn ich die nächsten Tage mein Notebook wieder ins Netzwerk anschließe werd ichs darauf testen.

    Wenn das allerdings nichts weiter bringt werde ich den Source nochmal neu schreiben, da durch meine vielen vergeblichen Experimente mit den Dateien inzwischen nen undurchsichtiger Wust entstanden ist.

    Trotzdem Danke für eure zahlreichen Hilfsversuche, zumindest is mir inzwischen klar wies aussehen müsste wenns funktioniert ^^

    Gruß
    Auron


Anmelden zum Antworten