Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Frage an AppleScript/Automator Experten: Watchfolder-Kopieren!

Frage an AppleScript/Automator Experten: Watchfolder-Kopieren!

se_wi29.03.1420:25
Hallo

ich versuche mich gerade an einem eigentlich simplen Problem: Ich möchte im Netzwerk (zB auf einem NAS) einen Ordner haben, dessen Inhalt sofort nach Erscheinen auf einen lokalen Ordner auf dem Mac kopiert wird. Ich habe das auch erfolgreich in Automator hinbekommen, über eine Ordneraktion mit Kopieren und Schleife. Das Problem ist nur, dass Kopien von Windowsrechnern schon während des in den Watchfolderkopierens abgegriffen werden und dann natürlich unvollständig sind.
Ergo bräuchte man einen Größencheck Größe/Zeit1 = Größe/Zeit2. Leider habe ich keine derartige Funktion in Automator gefunden, aber in Applescript, nur leider bekomme ich da die ganze Watchfolder und Kopieren Sache nicht hin. Hat vielleicht jemand ein ähnliches Problem gehabt und auch lösen können?

schonmal dankbare Grüße
0

Kommentare

Michael Schmidt
Michael Schmidt29.03.1421:27
Hi,
wenn du ein Applescript gefunden hast, was genau das tut, was du willst, nämlich warten, bis die Kopie beendet wurde, kannst du dieses AppleSkript in Automator einbauen.
Der Appplescript-Baustein bekommt POSIX-Pfade übergeben und gibt m.W. auch POSIX-Pfade an den nächsten Baustein weiter.

Viele Grüße,
Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Bitnacht30.03.1410:57
Das sollte dann so aussehen, denke ich:
0
Bitnacht30.03.1411:00
Oben fehlt natürlich noch:
on run {input, parameters}
und diese Zeile muss natürlich ohne -12 im echten Code:
set lastSize to fileSIZE - 12
Plus noch ein paar weitere Änderungen, denke ich.
0
se_wi31.03.1415:09
Hallo ihr beiden!
Schonmal vielen Dank für die Info!
@Bitnacht

Dein Code sieht schonmal sehr gut aus, funktioniert aber leider nicht, ich bekomme den Fehler -1409! Keine Ahnung was der meint.

Als Basis für meine Versuche hatte ich folgenden Code genommen
Eigentlich sollte dieser mein Vorhaben schon ziemlich genau abdecken, funktionierte bei mir leider nicht. Er kopierte Files immer mehrfach. Ausserdem wäre mir Bewegen statt Kopieren lieber, aber das ist die Kür
Aus dem Code denke ich ist folgender Teil wichtig
try
    set the target_file to item_path as POSIX file as alias
    repeat
        set this_info to the info for the target_file
        set size_A to the size of this_info
        delay 3
        set this_info to the info for the target_file
        set size_B to the size of this_info
        if size_A is equal to size_B and size_B is not 0 then
            -- COPY ITEMS TO FOLDER
            tell application "Finder"
                if not (exists target_folder) then
                    set quit_flag to true
                    error "The chosen destination folder does not exist on this computer." & return & return & (target_folder as Unicode text)
                end if
                copy (my derive_filename(target_file, "", "-", target_folder)) to {derived_name, target_HFSpath}
                set the current_name to the name of the target_file
                if the current_name is the derived_name then
                    ignoring application responses
                        move the target_file to target_folder with replacing
                    end ignoring
                else
                    move the target_file to the temporary_items_folder with replacing
                    delay 0.5
                    set the name of document file current_name of the temporary_items_folder to the derived_name
                    delay 0.5
                    ignoring application responses
                        move document file derived_name of the temporary_items_folder to the target_folder with replacing
                    end ignoring
                end if
            end tell
            do shell script ("defaults delete com.apple.Aperture.DuplicateFilesToFolderAction " & item_identifier)
            delay 0.5
            exit repeat
        end if
    end repeat
end try

Kann man daraus was basteln? Schonmal Danke und Grüße
0
se_wi31.03.1415:10
Leider ist die Formatierung weg, deshalb als Screenshot nochmal zum lesen

edit: Shit, Screenshot dafür zu klein!
0
se_wi31.03.1415:22
Mein Workflow
0
Thomas Kaiser
Thomas Kaiser31.03.1415:49
se_wi
Das Problem ist nur, dass Kopien von Windowsrechnern schon während des in den Watchfolderkopierens abgegriffen werden und dann natürlich unvollständig sind.

Dann überleg Dir doch erstmal, warum das so ist. Also was den Automator denken läßt, die Datei sei schon fertig geschrieben.
se_wi
ich bekomme den Fehler -1409! Keine Ahnung was der meint.

Das ist errFSForkNotFound, einfach ohne das Minus bei Google nach der Zahl und "os x error" suchen.
se_wi
Als Basis für meine Versuche hatte ich folgenden Code genommen
Eigentlich sollte dieser mein Vorhaben schon ziemlich genau abdecken, funktionierte bei mir leider nicht. Er kopierte Files immer mehrfach. Ausserdem wäre mir Bewegen statt Kopieren lieber, aber das ist die Kür

Nö, das ist genau genommen der Showstopper bzw. der Moment, an dem Du das Ganze konzeptionell betrachten solltest.

Das Skript, das Du da aufgegabelt hast, definiert eine Ordneraktion. Das ist seit einigen OS X Versionen technisch gesehen nix weiter als ein sog. LaunchAgent, der auf gewisse Ordner scharfgeschalten wird. Wenn die Ordner lokal sind (HFS+), dann kommt der fsevents-Mechanismus zum Einsatz, wenn das Ganze sonstwo liegen soll, findet ein Polling des Ordners statt.

Wenn -- wie Du ja beschreibst -- das Skript zu früh bzw. öfter aufgerufen wird, dann hast Du folgendes Problem: Die Ordneraktion wird abgefeuert obwohl die Datei noch nicht fertig geschrieben ist. Wie kriegst Du raus, ob die Datei vollständig in den überwachten Ordner kopiert wurde? Mit Deinem Ansatz... gar nicht außer Du lagerst das Erkennen/Abwarten, ob sich die Datei von der Größe oder vom Modification Date her noch ändert (und das wäre nun die Kür: Zu beobachten, was anders ist, wenn die Dateien "von Windows kommen") in eine durch einen längeren delay/sleep-Block abgetrennte Routine aus (denn der Trick besteht ja darin, den letzten Event, wegen dem Dein Skript getriggert wird, insofern zu erkennen, als danach keiner mehr kommt und sich die Datein von den Eigenschaften her nicht mehr geändert hat). Dann kannst Du den Ordneraktion-Ansatz aber auch gleich knicken, weil Du mit einem Ansatz, der selbständig periodisch das überwachte Verzeichnis pollt und das Inhalts-Listing mit "vorher" vergleicht, besser fährst.

Merke: Event-basierte Ansätze sind in dem Moment sinnlos, in dem man sich auf die Events nicht verlassen kann.

Abschließend: Um Code-Schnipsel zu posten gibt es pastebin.com und Co. -- funktioniert ohne Anmeldung, unerstützt Syntax Highlighting (sogar für AppleScript) und geht ratzfatz.
0
se_wi31.03.1419:49
Hallo Thomas,

danke für deine ausführliche... Ausführung! Aber das ist natürlich nicht das, was ich hören möchte, weil ich mich so nah am Ziel wähnte und mir nicht vorstellen konnte, dass es so kompliziert oder gar unmöglich ist.
Leider reichen meine AppleScript Fähigkeiten nicht aus, um die von dir beschriebenen Funktionen umzusetzen. Du kennst nicht zufällig Beispiele, wo ähnliche Sachen umgesetzt werden?

Vielen Dank und Grüße
sewi
0
Thomas Kaiser
Thomas Kaiser31.03.1422:35
se_wi
das ist natürlich nicht das, was ich hören möchte

Schade, weil Du schon seltenes Glück brauchst, um in Foren auf Menschen zu treffen, die Dir für lau komplexe Probleme schlüsselfertig lösen. Das Beste, was man erwarten sollte, ist, dass man 'ne Menge lernen kann (das war zumindest meine Intention). Ohne Flax: Aber wenn Du vor dem Problem stehst, dass der "Hotfolder-Mechanismus an sich" nicht verläßlich funktioniert (in Deinem Fall LaunchAgents bzw. Folder Actions), dann wird's komplex und kompliziert. Bzw. muß man sich dann recht schnell eingestehen, dass das Andocken an eigentlich taugliche Mechanismen (Ordneraktionen in dem Fall) nix bringt.
0
se_wi01.04.1408:51
Danke Dir Thomas, die bittere Wahrheit eingeprügelt! So musses sein. Gut, ich werde versuchen, mich noch etwas damit zu beschäftigen und hoffe, dass vielleicht jemand einen Workaround kennt.

Danke
0
Thomas Kaiser
Thomas Kaiser01.04.1410:29
se_wi
ich werde versuchen, mich noch etwas damit zu beschäftigen und hoffe, dass vielleicht jemand einen Workaround kennt.

Ich wollte übrigens hier keine Diskussion abwürgen, ganz im Gegenteil. Meines Erachtens ist der einzige Sinn und Zweck von Technikforen oder vergleichbaren Diskussionsmedien der, dass am Ende irgendwer schlauer ist (egal ob Fragesteller oder potentielle Beantworter).

Für nen Workaround braucht's übrigens erstmal ein klar eingegrenztes Problem. Und daran haperts nach wie vor bzw. sind das meinerseits bislang nur vage Vermutungen anhand dessen, was ich meine, herrausgelesen zu haben (Überwachter Ordner auf NAS, klappt eigentlich per Ordneraktion, wenn allerdings Windows-Systeme aufs NAS kopieren, triggert das den Aufruf der Ordneraktion verfrüht/mehrfach -- korrekt?)
0
se_wi02.04.1418:49
Hallo Thomas,
ja so hast du das gut verstanden, es gibt einen freigegebenen Ordner auf dem Server, daran hängen mehrere Rechner, PCs und Macs, oft wird am PC zum Beispiel etwas aus dem Internet runtergeladen, was am Mac gebraucht wird (direkte Freigabe am Mac ist nicht erwünscht). Also lade ich es am PC auf die Serverfreigabe, gehe zum Mac und kopiere es lokal. Diesen Schritt wollte ich mir halt ersparen und automatisieren. Vielleicht liegts auch an SMB als Netzwerkprotokoll? Denn auch wenn der Mac auf den Server kopiert, greift ein anderer die Datei zu früh ab.... also Sizecheck Schleife muss wohl sein.

Aber danke auf jedenfall für deine Anregungen!
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.