Hilfe bei SaveFileDialog

Mancha

Grünschnabel
Hallo,

ich habe eine Anwendung (InfoPath) laufen, mit der ich von .NET aus zugreife. Ich rufe von Windows-Forms den SaveFileDialog auf, um die Datei zu speichern.
Wenn ich unter einem anderen Namen die Datei abspeicher, funktioniert das Speichern wunderbar. Wenn ich aber die bestehende geöffnete Datei überschreiben will, kommt ein Fehler, daß der Prozess nicht auf die Datei zugreifen kann, da sie von einem anderen verwendet wird.
Was muß ich im Code umändern?

Mein Code:

Code:
Stream myStream;

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

saveFileDialog1.Filter = "xml files (*.xml)|*.xml";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = true;
 
if(saveFileDialog1.ShowDialog() == DialogResult.OK)
{
	if((myStream = saveFileDialog1.OpenFile()) != null)
	{
	        StreamWriter sw =new StreamWriter(myStream);

		sw.Write(thisXDocument.DOM.xml);
		sw.Close();
		myStream.Close();
	}
}
 
Das hat nicht direkt mit deinem Code zu tun, das ist ein windowsspezifisches Problem. Das wäre das selbe, als wie wenn du ein geöffnetes File löschen willst, wärend dem du es dir Ansiehst.
Ich sehe zwei möglichkeiten:
1. Schliesse das File, bevor du es Speicherst
2. Gib ihm einen anderen Namen
:suspekt:

Just my two cents

so long
ziop :)
 
Die Datei kann ich nicht schließen, da sie ja geöffnet ist. Oder wie kann ich sie schließen?

Ich hab es bis jetzt so gelöst, daß eine Meldung kommt und der Nutzer einen anderen Datein amen beim Speichern angeben muß.
 
Hast du die Datei mit READONLY geöffnet ? Denn es kann immer nur einer schreibend auf die Datei zugreifen.

Und wieso kannst du die Datei nach dem öffnen nicht wieder freigeben ? Reicht das nicht wenn du die nur dann wieder öffnest, wenn du was ändern willst ?

Gruss

MFC OpenGL
 
Hi Mancha!
Mancha hat gesagt.:
ich habe eine Anwendung (InfoPath) laufen, mit der ich von .NET aus zugreife.
Werd mal bitte ein bissel präziser, damit ich versteh was Du da überhaupt machst.
Was hat das xmlFile mit InfoPath zu tun? :confused:
Mancha hat gesagt.:
Die Datei kann ich nicht schließen, da sie ja geöffnet ist. Oder wie kann ich sie schließen?
Gegenfrage. Wie öffnest das File denn?

MfG, cosmo
 
cosmochaosmaker hat gesagt.:
Hi Mancha!
Werd mal bitte ein bissel präziser, damit ich versteh was Du da überhaupt machst.
Ich öffne eine InfoPath-Formular und habe einen eigenen Button zum Speichern definiert. Das Speichern von InfoPath ist abgeschalten. Ist so vorgegeben vom Kunden.


cosmochaosmaker hat gesagt.:
Was hat das xmlFile mit InfoPath zu tun? :confused:
MfG, cosmo

Das xmlFile ist das InfoPath-Formular, das gespeichert werden soll.

cosmochaosmaker hat gesagt.:
Gegenfrage. Wie öffnest das File denn?

Die Datei wird geöffnet, in dem die entsprechende Datei ausgewählt wird und dann öffnet es sich in InfoPath. Anhand des Buttons soll es nun gespeichert werden.
 
Gehen wir mal davon aus, dass das InfoPath das File selber in einen FileStream einliest,
diesen aber aber nicht schließt solang das File im InfoPath geöffet ist.
Du müsstest dann das InfoPath-Formular schließen bevor Du speichern kannst.
Was aber wiederum keinen Sinn machen würde,
da Du ja nur von deiner C# Anwendnung aus speichern darfst
aber durch das Schließen würden die Änderungen ja verloren gehen.

Was passiert nun mit thisXDocument im Detail?
//Edit:
Wird es von deinem Programm oder vom InfoPath selber geändert?
Letzteres würde das Speichern von deinem Programm aus ausschließen.

MfG, cosmo
 
Zuletzt bearbeitet:
Mancha hat gesagt.:
thisXDocument wird von InfoPath geändert.
Ok, Du übergibst es dann sicher dem InfoPath im Konstuktor oder via Property?
Wenn es so ist, hast warscheinlich vergessen den Stream, mit dem Du das XmlDocument einließt, zu schließen.
Code:
DialogResult Result;
XmlDocument doc;

using ( OpenFileDialog Dialog = new OpenFileDialog() ){
	
	Dialog.CheckFileExists = true;
	Dialog.Title = "XML Laden";
	Dialog.Filter = "XML-Dateien|*.xml";
	Dialog.RestoreDirectory = true;

	Result = Dialog.ShowDialog();

	if ( Result == DialogResult.OK ){ // Wenn die Datei ausgewählt wurde wird sie eingelesen

		using ( TextReader textReader = new StreamReader( Dialog.FileName, Encoding.Default ) ){
			doc = new XmlDocument();
			doc.Load( textReader );
		}
	}
}
Nach dem using-Block wird das File selbsttätig geschlossen.
Versuch ansonsten das XmlDocument doch mal mithilfe von XmlDocument.Load( string File ) zu öffnen.,
sofern Du kein spezielles Encoding verwendest.

MfG, cosmo
 

Neue Beiträge

Zurück