Hallo Liste,

schlage mich seit einigen Tagen mit einem Problem herum und sehe einfach kein 
Land.

Zur Situation:
Ich habe einen kleinen Daemon in meine Rails app integriert, der ein Folder, 
dass als Dropbox dient, auf neue Dateieingänge überwachen soll.
Ist eine Datei eingegangen, soll diese in ein temporäres Verzeichnis geschoben 
werden, auf das der User erstmal keinen Zugriff hat.

Nun stehe ich vor folgendem Problem:
Kopiere ich zum Beispiel über das Netzwerk eine große Datei in die Dropbox 
macht sich der Daemon fröhlich daran diese zu verschieben, obwohl sie noch gar 
nicht vollständig ist.
Ich würde daher gerne vorher überprüfen, ob ein anderer Prozess grade an der 
Datei schreibt.
Leider hat File kein Attribut um das filelock ab zu fragen, sondern nur eine 
Methode um es zu setzen...
Hatte schon überlegt bei jedem Durchgang des Loop zu schauen, ob sich die Größe 
der Datei verändert hat, aber ich habe gehofft, dass es da evtl. einen 
saubereren Weg gibt.

Bin bei meiner suche auch auf folgenden Codeschnipsel gestoßen:

class File
  def flocked? &block
    status = flock LOCK_EX|LOCK_NB
    case status
      when false
        return true 
      when 0
        begin
          block ? block.call : false
        ensure
          flock LOCK_UN
        end
      else
        raise SystemCallError, status
    end
  end
end


Allerdings scheint dies nicht wirklich zu funktionieren, da File.flock? mir 
stets meldet, dass die Datei nicht gelockt sei - was ja eigentlich nicht 
wirklich sein kann, da ja ein anderer Prozess die Datei grade auf die Platte 
schreibt...
Ich weiß, das mehr oder weniger ein reines Ruby - Problem, aber vielleicht hat 
jemand von Euch eine Idee, wie man so etwas hinbekommen kann?

Grüße
Matze
_______________________________________________
rubyonrails-ug mailing list
rubyonrails-ug@headflash.com
http://mailman.headflash.com/listinfo/rubyonrails-ug

Antwort per Email an