<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Speichern von Dokument abbrechen]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Mein Problem:</p>
<p>Bevor in meiner MDI-Anwendung ein Dokument gespeichert wird, muss ich prüfen, ob nicht bereits ein Dokument mit dem selben Namen geöffnet ist. Ist dies der Fall soll das speichern abgebrochen werden.</p>
<p>Soweit kein Problem. Gelöst hab ich das ganze so:</p>
<pre><code class="language-cpp">BOOL CxxxDoc::OnSaveDocument(LPCTSTR lpszPathName)
  {
  CString fileName = lpszPathName;

  // Dateinamen aus Pfad herausfiltern
  fileName = fileName.Right(fileName.GetLength() - fileName.ReverseFind('\\') - 1);

  // Prüfen, ob bereits Dokument mit selben Namen offen ist
  // ...

  if (bAlreadyOpen)
    {
    AfxMessageBox(&quot;Dokument mit selben Namen bereits geöffnet!&quot;);
    return FALSE;
    }

  return CDocument::OnSaveDocument(lpszPathName))
  }
</code></pre>
<p>Das funktioniert soweit, nur bin ich gerade auf folgendes Problem gestoßen, welches ich am besten mit einem kleinen Szenario beschreibe:</p>
<p>- <a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> existiert an 2 Orten (zB. C:\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> und C:\foo\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a>)</p>
<p>-&gt; C:\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> wird geöffnet<br />
-&gt; Ein neues Dokument wird geöffnet<br />
-&gt; Benutzer möchte neues Dokument unter C:\foo\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> speichern<br />
-&gt; Natürlich wird er gefragt, ob die Datei überschrieben werden soll (mit Ja bestätigt)<br />
-&gt; Oben angeführter Code wird ausgeführt und meldet, dass bereits ein Dokument mit diesem Namen offen ist<br />
-&gt; OnSaveDocument wird mit FALSE abgebrochen und Dokument wird natürlich nicht gespeichert<br />
-&gt; !!!! C:\foo\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> ist von der Festplatte verschwunden, da das überschrieben ja gestattet wurde, danach das speichern jedoch abgebrochen wurde !!!!</p>
<p>Dieser Zustand ist natürlich absolut inakzeptabel, weshalb ich hier nun nachfrage, wie man das abbrechen des Speicherns besser gestallten könnte, damit die alte Datei in so einem Fall nicht mehr gelöscht wird?</p>
<p>danke, mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179193/speichern-von-dokument-abbrechen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 20:37:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179193.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Apr 2007 10:37:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speichern von Dokument abbrechen on Thu, 19 Apr 2007 10:37:39 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Mein Problem:</p>
<p>Bevor in meiner MDI-Anwendung ein Dokument gespeichert wird, muss ich prüfen, ob nicht bereits ein Dokument mit dem selben Namen geöffnet ist. Ist dies der Fall soll das speichern abgebrochen werden.</p>
<p>Soweit kein Problem. Gelöst hab ich das ganze so:</p>
<pre><code class="language-cpp">BOOL CxxxDoc::OnSaveDocument(LPCTSTR lpszPathName)
  {
  CString fileName = lpszPathName;

  // Dateinamen aus Pfad herausfiltern
  fileName = fileName.Right(fileName.GetLength() - fileName.ReverseFind('\\') - 1);

  // Prüfen, ob bereits Dokument mit selben Namen offen ist
  // ...

  if (bAlreadyOpen)
    {
    AfxMessageBox(&quot;Dokument mit selben Namen bereits geöffnet!&quot;);
    return FALSE;
    }

  return CDocument::OnSaveDocument(lpszPathName))
  }
</code></pre>
<p>Das funktioniert soweit, nur bin ich gerade auf folgendes Problem gestoßen, welches ich am besten mit einem kleinen Szenario beschreibe:</p>
<p>- <a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> existiert an 2 Orten (zB. C:\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> und C:\foo\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a>)</p>
<p>-&gt; C:\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> wird geöffnet<br />
-&gt; Ein neues Dokument wird geöffnet<br />
-&gt; Benutzer möchte neues Dokument unter C:\foo\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> speichern<br />
-&gt; Natürlich wird er gefragt, ob die Datei überschrieben werden soll (mit Ja bestätigt)<br />
-&gt; Oben angeführter Code wird ausgeführt und meldet, dass bereits ein Dokument mit diesem Namen offen ist<br />
-&gt; OnSaveDocument wird mit FALSE abgebrochen und Dokument wird natürlich nicht gespeichert<br />
-&gt; !!!! C:\foo\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> ist von der Festplatte verschwunden, da das überschrieben ja gestattet wurde, danach das speichern jedoch abgebrochen wurde !!!!</p>
<p>Dieser Zustand ist natürlich absolut inakzeptabel, weshalb ich hier nun nachfrage, wie man das abbrechen des Speicherns besser gestallten könnte, damit die alte Datei in so einem Fall nicht mehr gelöscht wird?</p>
<p>danke, mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269132</guid><dc:creator><![CDATA[suamikim]]></dc:creator><pubDate>Thu, 19 Apr 2007 10:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to Speichern von Dokument abbrechen on Thu, 19 Apr 2007 10:47:26 GMT]]></title><description><![CDATA[<p>Kannst du nicht mit totalen Pfaden statt mit Dateinamen arbeiten? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269141</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Thu, 19 Apr 2007 10:47:26 GMT</pubDate></item><item><title><![CDATA[Reply to Speichern von Dokument abbrechen on Thu, 19 Apr 2007 10:49:18 GMT]]></title><description><![CDATA[<p>Nulltens: Ist das ein theoretisches Szenario oder hast du das praktisch ausprobiert?</p>
<p>Erstens: Das Überschreiben der Datei passiert erst in der CDocument::OnSaveDocument() - wenn du den Vorgang bereits vorher abbrichst, passiert mit deinen Daten <em>überhaupt nichts</em>.</p>
<p>Zweitens: Normalerweise sollte diese Überprüfung, ob ein Dokument schon offen ist, den gesamten Pfad mit einbeziehen (die beste Lösung ist, die Datei exklusiv zu öffnen, während du sie verwendest, dann wird der Versuch, sie zu überschreiben, direkt erkannt). Wenn die C:\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> Probleme macht, wenn du woanders eine gleichnamige Datei anlegen willst, ist deine Überprüfung fehlerhaft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269142</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 10:49:18 GMT</pubDate></item><item><title><![CDATA[Reply to Speichern von Dokument abbrechen on Thu, 19 Apr 2007 11:34:16 GMT]]></title><description><![CDATA[<p>estartu schrieb:</p>
<blockquote>
<p>Kannst du nicht mit totalen Pfaden statt mit Dateinamen arbeiten? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Nein, kann ich nicht. Im Programm wird ein Baum mit allen offenen Dokumenten angezeigt (Dateiname ist immer der Root-Knoten).<br />
Hier kommt es dann im weitern verlauf zu Problemen, wenn mehrere Dokumente mit dem selben Namen geöffnet sind.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Nulltens: Ist das ein theoretisches Szenario oder hast du das praktisch ausprobiert?</p>
</blockquote>
<p>Das hab ich so ausprobiert, bzw. ist es mir eher zufällig aufgefallen.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Erstens: Das Überschreiben der Datei passiert erst in der CDocument::OnSaveDocument() - wenn du den Vorgang bereits vorher abbrichst, passiert mit deinen Daten überhaupt nichts.</p>
</blockquote>
<p>Davon bin ich anfangs auch ausgegangen. Leider wird die Datei trotzdem gelöscht, ohne dass CDocument::OnSaveDocument aufgerufen wird...</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Zweitens: Normalerweise sollte diese Überprüfung, ob ein Dokument schon offen ist, den gesamten Pfad mit einbeziehen (die beste Lösung ist, die Datei exklusiv zu öffnen, während du sie verwendest, dann wird der Versuch, sie zu überschreiben, direkt erkannt). Wenn die C:\<a href="http://Dok1.xxx" rel="nofollow">Dok1.xxx</a> Probleme macht, wenn du woanders eine gleichnamige Datei anlegen willst, ist deine Überprüfung fehlerhaft.</p>
</blockquote>
<p>Wie oben bereits erwähnt kann ich nicht den ganzen Pfad miteinbeziehen, da schlicht und einfach keine 2 Dokumente mit dem selben Namen geöffnet sein dürfen (egal, wo sie gespeichert sind).<br />
Das exklusiv öffnen hilft mir hier auch nichts, da die 2. Datei, welche überschrieben bzw. gelöscht wird, ja nicht geöffnet ist (oder hab ich dich nicht richtig verstanden?)...</p>
<p>Bin übrigens gerade beim Debuggen auf jenen Code in der MFC gestoßen, welcher das löschen auslöst:</p>
<p><strong>doccore.cpp</strong><br />
Methode <em>BOOL CDocument::DoSave(LPCTSTR lpszPathName, BOOL bReplace)</em><br />
Zeile 329 - 346:</p>
<pre><code class="language-cpp">if (!OnSaveDocument(newName))
	{
		if (lpszPathName == NULL)
		{
			// be sure to delete the file
			TRY
			{
				CFile::Remove(newName);
			}
			CATCH_ALL(e)
			{
				TRACE(traceAppMsg, 0, &quot;Warning: failed to delete file after failed SaveAs.\n&quot;);
				DELETE_EXCEPTION(e);
			}
			END_CATCH_ALL
		}
		return FALSE;
	}
</code></pre>
<p>Somit ist klar, dass das gewählte File gelöscht wird, wenn der Speichervorgang fehlschlägt.<br />
Dann werde ich wohl DoSave überschreiben müssen...</p>
<p>Werde mich da mal probieren und hier wieder melden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269171</guid><dc:creator><![CDATA[suamikim]]></dc:creator><pubDate>Thu, 19 Apr 2007 11:34:16 GMT</pubDate></item><item><title><![CDATA[Reply to Speichern von Dokument abbrechen on Thu, 19 Apr 2007 12:07:54 GMT]]></title><description><![CDATA[<p>Gesagt ... getan:</p>
<p>DoSave überschrieben und nun funzt das ganze wie ich es mir vorstelle!</p>
<p>danke, mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269206</guid><dc:creator><![CDATA[suamikim]]></dc:creator><pubDate>Thu, 19 Apr 2007 12:07:54 GMT</pubDate></item></channel></rss>