Datei aktuell geöffnet?

Dimitry

Grünschnabel
Hallo .NETler,

bevor Ihr in das wohl verdiente Wochenende geht, möchte ich Euch bitten, mir mal eine Frage zu beantworten.

Wie ist es am besten aus VB.NET festzustellen, ob eine bestimmte Datei aktuell geöffnet ist? (Es soll sicherlich irgend eine Funktion dafür geben. Im Namen space File. habe ich nicht passendes gefunden.)

If (diese Funktion von der Dateierweiterung abhängig ist = TRUE) Then

Ich interessiere mich insb. für diese Prüfung bei einer .TXT-Datei. Wenn diese geöffnet ist möchte ich sie schließen, um ungestört dort die Information hineinzuschreiben.

Rang zwei weise ich der .XLS-Datei zu.

Else

Auf eine generälle Antwort freue ich mich ebenfalls

End If

Ich habe festgestellt, daß wenn die .TXT-Datei geöffnet ist, ist es für streamWriter nicht möglich in diese Datei etwas hineinzuschreiben. Ist es richtig? Warum?

Schönes Wochenende,

Dimitri
 
Also ob .NET schon eine passende Funktion bereithält, um zu prüfen ob eine Datei bereits im Zugriff ist oder nicht, weiß ich leider nicht. Aber es ist nicht sonderlich schwer das selber zu machen:

1.) Datei zum Schreiben öffnen
2.) Fehler abfangen
3.) Wenn Fehler vorhanden, dann war sie geöffnet bzw. schreibgeschützt

Wesentlich schwieriger sollte es werden die Datei dann zu schließen. Wenn die Datei von Dir selber mit einem Deiner Programme geöffnet wurde, dann ist es relativ einfach sie wieder zu schließen. Kontrolle über Deine eigenen Sourcen solltest ja haben. :) Aber wenn die Datei von einem anderen Programm wie z.B. MS-Word geöffnet wurde, dann wüsste ich jetzt nicht wie Du die Datei dann freibekommst, wobei das nicht heissen soll, dass es nicht geht.
Du könntest ja dann eine temporäre Datei erstellen und sobald die ursprüngliche Datei wieder freigegeben wurde kannst die eine Datei löschen und die Temp-Datei umbenennen.

Es ist völlig irrelevant, ob eine sich um eine Textdatei oder um eine andere Art von Datei handelt, Zugriff ist Zugriff und Windows gewährt Dir nur Lesezugriff auf eine bereits geöffnete Datei. Macht ja auch Sinn! Stell Dir mal vor zwei oder gar mehrere User editieren ein und die selbe Datei und speichern. Das Spielchen würde wohl "der letzte gewinnt" heissen. Deswegen darf Dein StreamWriter auch nix reinschreiben. Nur 1 Schreibzugriff pro File, Lesezugriffe sind mehrere möglich.
 
Hallo Saber,

vielen Dank für Deine Antwort.

Ich habe mittlerweile mein Problem mit Hilfe "Process" gelöst.

Möchte Dich aber bitten, mir ein kleines Bsp zukommen zu lasse, was Deine Idee mit dem Fehlerabfangen angeht.

Ich habe noch keine Fehler abfangen müssen, aber wie es z. Zt. aussieht, komm dieses Problem auf mich zu.

Kannst Du mir bitte auch zeigen, wie man einen Fehler selbst generieren kann.

Ich wünsche Dir noch einen schönen Tag.

Dimitri
 
Fehlerbehandlung in .NET sind ziemlich einfach. Hier ein einfaches Konstrukt zum Exception Handling ...
Code:
try
{
   // Hier steht der Code, der überwacht werden soll
}
catch
{
   // Hier steht der Code, der ausgeführt wird, sollte im try-Block ein Fehler auftreten
}
finally
{
   // Wird immer ausgeführt, ob nun Fehler auftreten oder nicht
}
Den finally-Block kannst Du meist auch weglassen, ist aber bei bestimmten Problemstellungen aber sehr sinnvoll.

Im catch-Block kannst Du auch verschiedene Fehlertypen abfangen bzw. Du kannst mehrere catch-Blöcke erstellen.
Code:
try
{
   ...
}
catch (System.Data.DataException exc)
{
   // Fehler-Handling für Datenbankfehler
}
catch (System.Exception exc)
{
   // Quelltext für allgemeine Fehler

   MessageBox.Show(this, exc.Message);
}

Bei Deinem Problem müsstest Du im try-Block die Datei öffnen. Sprint er anschließend in den catch-Block weißt Du, dass etwas mit der Datei nicht stimmt und kannst darauf reagieren.
Läuft er nicht durch den catch-Block, so hat alles geklappt. Dieses Konzept kann und sollte man natürlich noch verfeinern. :)
 
Zurück