C# Feststellen, ob eine Datei fertig geschrieben ist - saubere Lösung

Smagjus

Rear Admiral
Registriert
Feb. 2011
Beiträge
6.134
Guten Abend Programmierer :)

Ich habe ein Problem, bei dem ich eigentlich sagen würde man kann es leicht mit Google lösen. Naja, es geht auch, aber ich würde gerne wissen, ob es eine saubere Lösung dafür gibt.

Code:
        public static void main(string[] args)
        {               
               ​while (!IsFileReady(path)) ;
               //File verarbeiten
​        }

        private static bool IsFileReady(String sFilename)
        {
            // If the file can be opened for exclusive access it means that the file
            // is no longer locked by another process.
            try
            {
                using (FileStream inputStream = File.Open(sFilename, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    if (inputStream.Length > 0)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }


                }
            }
            catch (Exception)
            {
                return false;
            }
        }
Der Ablauf ist folgender: Ein fremdes Programm schreibt eine Bilddatei in einen vorgesehenen Ordner. Der Ordner wird von meinem Programm überwacht. Sobald das Bild fertig geschrieben ist, soll der Upload beginnen.

Der oben gezeigte Code lastet aufgrund der while-Schleife einen Kern komplett aus, was schonmal weniger schön. Thread.sleep würde ich gerne nur als Notlösung verwenden. Gibt es einen weg, das ganze so realisieren, dass ich ohne das Werfen einer Exception auskomme? Ich bin da etwas eigen und finde den Stil nicht sonderlich ansprechend.
 
Das Stichwort heißt (Thread) Synchronisierung.

Edit: Ok, neuer Anlauf, war Unsinn. Hab leider nur überflogen.

Also evtl könntest du über einen FileSystemWatcher gehen?
 
Zuletzt bearbeitet:
Wieso benennst Du die Datei nicht einfach um *.png.part -> *.png wenns fertig ist.

Edit: ach ist ja "Fremdes" Programm. Kannste also nicht drauf zugreifen?
 
Zuletzt bearbeitet:
Evtl. mit der FileSystemWatcher-Klasse? Weiß aber nicht, ob das Changed-Event erst aufgerufen wird, wenn die Datei fertig geschrieben ist, oder schon vorher. Müsste man ausprobieren.
 
Überprüf doch ob sich die Dateigröße die letzten paar Sekunden/Minuten geändert hat oder nicht.
 
Die ersten beiden Lösungen gehen zumindest nach meinem Verständnis nicht. Ich hatte geschrieben, dass es sich um ein fremdes Programm handelt, welches die Datei erstellt. Ich habe also keinen Zugriff auf dessen Sourcecode.

Die Methode mit dem Changed Event Teste ich gerade.

Die Idee mit der Dateigröße ist auch gut, nicht 100% sauber wie ich finde, weil man das Pferd von hinten aufzäumt, aber trotzdem gut.
 
Zuletzt bearbeitet:
Also das Ziel sollte halt sein, weg vom Polling zu kommen (= kontinuierlichem Abfragen) hin zu einem Ereignis-gesteuerten Programm (deshalb evtl den Weg über den Watcher).

Wenn Polling, dann halt nur mit Thread.sleep... Dateigrößenbetrachtung wäre im Übrigen auch Polling...
 
Hat sich schon erledigt, vielen Dank für alle Antworten :)

grünel schrieb:
Evtl. mit der FileSystemWatcher-Klasse? Weiß aber nicht, ob das Changed-Event erst aufgerufen wird, wenn die Datei fertig geschrieben ist, oder schon vorher. Müsste man ausprobieren.
Die Methode mit Changed funktioniert tatsächlich! Vorher hatte ich das Created Event der FileSystemWatcher Klasse abgegriffen, was zu der von mir genannten Problematik führte.

​Danke! :)
 
Generell kann man sich beim Polling aber auch regelmässig "schlafen legen". Dann lastet man auch nicht das halbe System aus. :) So wie du die Anforderung beschreibst, kommt es ja nicht auf Millisekunden an. :D

Das nur als Anmerkung, du hast ja die saubere Lösung bereits gefunden.
 
Smagjus schrieb:
Hat sich schon erledigt, vielen Dank für alle Antworten :)


Die Methode mit Changed funktioniert tatsächlich! Vorher hatte ich das Created Event der FileSystemWatcher Klasse abgegriffen, was zu der von mir genannten Problematik führte.
​Danke! :)

Das ist aber nachwievor Polling (siehe MSDN).
Und eine vernünftige Lösung abseits vom Pollingnachteil ist es auch nicht. Du kannst nämlich nicht wissen, ob die Datei ansich fertiggeschrieben worden ist. Die richtige Lösung, wäre ein "Close" zu erkennen.

Google "c# check file closed". Der da meistvorgeschlagene Ansatz würde mit dem FileSystemWatcher kombiniert die beste Lösung sein nach "If((exists) && AlleFileHandlesimOSsindnichtfürdiedatei)".
 
Zuletzt bearbeitet:
Hey,

kann mir jemand helfen, wie man ein externe ueye Kamera in visual c# integriert bzw. wie baut man das Programm dafür auf?

Vielen Dank
 
Das hat weder etwas mit diesem Thema zu tun, noch ist deine Fragestellung auch nur annähernd ausführlich genug, um sinnvoll darauf einzugehen. Starte bitte einen eigenen Thread dazu und mach dir etwas mehr Gedanken zu deinem Thema. Auch darfst du vorab durchaus etwas selbst recherchieren, denn dir wird hier niemand eine Komplettlösung liefern können.
Eine weitere Diskussion zu diesem Thema ist in diesem Thread nicht erwünscht.
 
Zurück
Oben