Frage von Adam1985, 74

Kann ich mit Python herausfinden ob eine Datei "komplett" ist?

Hallo,

ich habe einen Server auf den Bilder geschickt werden, die so schnell wie möglich auf dem Bildschirm ausgegeben werden sollen.

Sobald eine neue Datei angelegt wird ändert sich die Ausgabe.

Manchmal wenn die Übertragung des Bildes etwas länger dauert werden nur 2/3 des Bildes angezeigt...

Kann ich irgendwie herasufinden, ob das Bild vollständig gefüllt wurde?

Expertenantwort
von guenterhalt, Community-Experte für Computer & Linux, 30

bist du sicher, dass so eine Bild-Datei wirklich nur zu 2/3 übertragen wurde.
Für Linux erscheint mir das recht ungewöhnlich. Beim Kopieren wird normalerweise die Datei zuerst mit einem temporären Namen gespeichert und erst dann, wenn sie komplett ist, erscheint der "richtige" Name erst im betreffenden Verzeichnis.

Die "unvollständige Darstellung" hat -so denke ich- mehr mit dem Verhalten des  Bild-Anzeige-Programms und der Geschwindigkeit deines Computers (einschließlich Festplatte/Speichermedium) zu tun.  

Die zum Server übertragenen Dateien müssen, wenn sie dort bereits vollständig sind, auch wieder auf den Client übertragen werden, um sie als Bild anzeigen zu können. Sollte das auch noch die ursprüngliche Quelle (vor dem Senden zum Server) sein, dann haben die Computer viel zu tun und erscheinen langsam.

Jetzt auch noch mit einem "privaten" Prüfsummen-Vergleich zu arbeiten, wird diesen "Teil-Bild-Effekt" dann sicher nur noch verstärken.


Kommentar von Adam1985 ,

Der Server ist hier ein Raspberry Pi, der mit dem Fernseher verbunden ist. Wenn man sich die Datei im Browser anschaut, ist sie vollständig. Nur zum Zeitpunkt des Aufrufs ist sie noch nicht ganz da. Also muss ich herausfinden wann die Datei komplett gefüllt wurde.

Antwort
von Linuxhase, 23

Hallo

ich habe einen Server auf den Bilder geschickt werden, die so schnell wie möglich auf dem Bildschirm ausgegeben werden sollen.

Auf einem Server gibt es normalerweise keine grafische Oberfläche, somit kann man da auch keine Bilder anzeigen lassen.

Kann ich irgendwie herasufinden, ob das Bild vollständig gefüllt wurde?

Indem Du die Checksumme (md5sum, sha1sum ect.) überprüfst oder gleich dem System mitteilst das es nur Dateien anzeigt die nicht gerade bearbeitet werden (lsof)

Verschickt wird mit FTP (im lokalen Netz), von einer Kamera aus

Da bietet es sich doch an ein Programm wie ffmpeg zu verwenden und die Serienaufnahmen zu streamen; gibt einige Anleitungen im Internet.

Linuxhase

Kommentar von Adam1985 ,

Der Server ist ein Pi. Der läuft ohne GUI und zeigt Bilder mithilfe von fbi (auf der "Kommandozeile") an. Für den Stream reicht der Speicher nicht aus. Der läuft voll und hängt sich auf. Wie komme ich an eine Checksum ran? Wie finde ich heraus ob die Datei noch bearbeitet wird?

Kommentar von Linuxhase ,

@Adam1985

Für den Stream reicht der Speicher nicht aus.

Also mein Sohn hat damit einen Livestream von einer Panoramacam erzeugt.

Der läuft voll und hängt sich auf.

Dann erstelle ein Script das nur eine bestimmte Anzahl an Bildern aufbewahrt und die jeweils älteste Datei löscht.

Wie komme ich an eine Checksum ran?

So z.B.:

md5sum /pfad/zur/datei/dateiname.ext

Wenn Du das zweimal hintereinander machst und sich dabei die Checksummen unterscheiden, dann ist die Datei noch nicht fertig; erst wenn die Summe zweimal die gleiche ist, ist die Datei fertig.

Wie finde ich heraus ob die Datei noch bearbeitet wird?

lsof | grep DATEINAME

Linuxhase

Antwort
von arachno1999, 41

Ich sehe zwei Möglichkeiten:

1. Wenn das Bildformat (PNG, BMP, JPG usw.) es hergibt, ist dort im Header der Datei die Größe in irgendeiner Form angegeben. Auch für Python gibt es sicher Libraries, die das Auslesen dieser Infos einfach ermöglichen.

Dann brauchst Du nur noch diesen Wert mit der aktuellen Länge der Datei (plus/minus ein paar Bytes) zu vergleichen, um festzustellen, ob die Datei vollständig übertragen ist.

2. Gibt das Bildformat die Info nicht her, hilf die Vergabe einer Checksumme (z.B. MD5 oder unter unixoiden Betriebssystemen "sum") und ein dreistufiges Vorgehen.

Stufe 1: Übertragen der Datei und der Checksumme

Stufe 2: Überprüfen der Checksumme auf dem Server

Stufe 3: Umbenennen der Datei in einen Namen und ein Verzeichnis, das von Deinem "Anzeigesystem" erkannt wird.

Kommentar von EightSix ,

Anscheinend bekommt der Fragesteller die Datei von einer Webcam auf einen FTP gespeichert. Mir fällt da auch keine Möglichkeit außer die 1. ein.

Bei einer selbst implementierten Übertragung würde es ja reichen die zu erwartenden Bytes im Protokoll anzumelden damit der Server Bescheid weiß was er bekommt.

Antwort
von joernius, 31

Wenn nur 2/3 des Bildes angezeigt werden, dann war zu dem Zeitpunkt eben nicht mehr da.

Entweder wurde die Anzeige zu früh gestartet (reload?) oder die Übertragung wurde unterbrochen. Möglich sind Netzprobleme oder ungünstiges Zusammenspiel Server/Client.

Starte den FTP-Server im Debug-Modus und sehe dir das Fehler-Protokoll an.

Siehe auch:

 http://www.elektronik-kompendium.de/sites/net/0902241.htm 


Kommentar von Adam1985 ,

Die Anzeige wird zu früh gestartet. Sobald der Dateiname auftaucht wir das Bild angezeigt. Ich habe schon eine verzögerung eingebaut, die aber unwirtschaftlich bei kleinen Dateien ist. Bei kleineren Dateigrößen funktioniert das Anzeigen. Ich müsste nur herausfinden wann die Datei nicht mehr beschrieben wird.

Kommentar von joernius ,

> Ich müsste nur herausfinden wann die Datei nicht mehr beschrieben wird.

So aus der Ferne schlage ich vor, die nicht abgeschlossene Datei lässt sich per Betriebssystemtools mit "lsof" feststellen.

Die äquivalente Aufgabe für Phyton sollte mit psutil zu realisieren sein.

Antwort
von EightSix, 40

Wie schickst du denn die Bilder hin? Würde das ins Übetragungsprotokoll einbauen.

Kommentar von Adam1985 ,

Verschickt wird mit FTP (im lokalen Netz), von einer Kamera aus

Keine passende Antwort gefunden?

Fragen Sie die Community