Forenindex » Programmierung/Entwicklung » AppleScript » Ordneraktion "first in first out"

Ordneraktion "first in first out"

Anonym
Beiträge gesamt: 22827

10. Nov 2005, 12:54
Bewertung:

gelesen: 2981

Beitrag als Lesezeichen
Hallo zusammen,
ein Ordner soll per AS überwacht werden. Daten die dort hereingeschriben werden, sollen in einen anderen festdefinierten Ordner weiterkopiert werden. Allerdings soll der Zeitraum zwischen dem weiterkopieren der einzelnen Daten mindesten 30 Sekunden betragen. Ganz wichtig ist, das die Daten in der Reihenfolge weiterverarbeitet werden, wie sie in den ersten Ordner hereingeschrieben werden. Der Zeitunterschied zwischen den Daten beträgt ca. 2 Sekunden.

Hat jemand eine Tip für mich?
Grüße
Uwe

Ordneraktion "first in first out"

Hans Haesler
  
Beiträge gesamt: 5826

10. Nov 2005, 14:54
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Uwe,

eine schwierige Aufgabe. Angenommen es kommen 10 Dateien in den Hotfolder.
Das Script setzt die Namen in eine Liste und schickt alle 30 Sekunden eine Datei
weiter. Das dauert fünf Minuten.

Fragen:
1. Kommen während dieser Zeit weitere Dateien in den Hotfolder?
2. Ist mit dem Zeitunterschied von 2 Sekunden die Ankunftszeit im Ordner gemeint?
3. Sind beide Ordner auf demselben Volumen?

Gruss, Hans

Ordneraktion "first in first out"

Anonym
Beiträge gesamt: 22827

10. Nov 2005, 15:25
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Hans,
zu Frage1: ich gehe im Moment davon aus das wir Jobweise vorgehen werden. D.h. es fallen 1Bit Tiffs in den Ordner die pro Job alle die gleichen 4 Anfangsbuchstaben haben.
zu Frage2: habe ich einfach einmal reingeschrieben, weiß nicht ob es von Wichtigkeit ist. Wenn z.B. zu einem Job 10 1Bit Tffs gehören dauert es mindestens 20 Sekunden bis alle Daten da sind. (ist aber meiner Meinung nach zu ignorieren)
zu Frage3: ja, gleiches Volume - es reicht also auch ein bewegen

Hintergrund der ganzen Angelegenheit:
Ich setzte hier den Flightcheck Workflow ein. Diese Software ermöglicht es mir u.a. Photoshop zu automatisieren. Es sollen Tiffs aufgerufen, per Aktion bearbeitet werden und gesichert werden. Allerdings geht Flightcheck nicht hin und verarbeitet die Daten so wie sie zeitlich in den Hotfolder fallen, sondern greift sich die Daten wie "es ihm gefällt". Deshalb sollen die Daten so in den Ordner kopiert werden, das Flightcheck nicht anders übrigbleibt wie diese eine Datei zu verarbeiten und dann die nächste (die ja 30Sekunden später hereinkopiert wird). Am Ende wird von den aus Photoshop geänderten 1Bit Tiffs ein Screenproof erstellt, wo es ganz wichtig ist das die Farben (Daten) die genaue Reighenfolge einhalten.

Ein bischen viel Erklärung - aber vielleicht bringt sie ja Licht ins Dunkle.

Gruß
Uwe

Ordneraktion "first in first out"

Hans Haesler
  
Beiträge gesamt: 5826

10. Nov 2005, 16:33
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Uwe,

es kann nie genug erklärt werden! Okay, ich werde versuchen, heute Abend etwas
zustandezubringen. Wird aber nicht einfach sein, die Bedingungen zu simulieren.

Gruss, Hans

Ordneraktion "first in first out"

Hans Haesler
  
Beiträge gesamt: 5826

11. Nov 2005, 08:50
Bewertung:

gelesen: 2981

Beitrag als Lesezeichen
Hallo Uwe,

gestern, kurz vor Mitternacht hatte ich eine erste Lösung. Dabei werden die Namen der eintreffenden Dateien
in eine Datei geschrieben. Damit das Script "weiss", dass der aktuelle Job beendet ist, muss man manuell
eine Datei namens "ende" in den Ordner kopieren.

Das funktioniert soweit gut, aber ich traue der Sache nicht so recht. Wenn die Dateien zu rasch hintereinander
eintreffen, dann könnte es sein, dass nicht alle erfasst würden. Das Script darf nur immer die erste Datei
erfassen. Es könnte mehrere aufnehmen, aber dann wäre die Reihenfolge nicht garantiert. Deshalb muss
zusätzlich noch das Modifikationsdatum festgestellt werden. Ich weiss noch nicht, ob ich dieses mit den Namen
in die Datei schreiben werde, um dann alle nach dem Datum zu sortieren, oder ob jedes "Paket" von Dateien
nach der Zeit sortiert wird, um dann nur den Namen festzuhalten.

Was ich wissen möchte: Unter welchem Mac OS soll das Script funktionieren? Panther (10.3.x)? Tiger (10.4.x)?

Gruss, Hans

Ordneraktion "first in first out"

Anonym
Beiträge gesamt: 22827

11. Nov 2005, 08:57
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Hans,

das Script sollte unter Mac OS 10.3.x laufen.

Gruss, Uwe

Ordneraktion "first in first out"

Hans Haesler
  
Beiträge gesamt: 5826

11. Nov 2005, 12:43
Bewertung:

gelesen: 2981

Beitrag als Lesezeichen
Hallo Uwe,

es ist geschafft! :-) Ich habe die schon skizzierte Strategie etwas geändert. Die Namen der Files werden
nicht in eine Datei geschrieben, sondern durch 'list folder' gesammelt.

Vorbereitungen:
1. Das Script sichern und an den zu überwachenden Ordner anfügen.
2. Eine beliebige Datei in diesen Ordner kopieren und im Dialog den Zielordner auswählen
(muss nur einmal gemacht werden; der Pfad wird gespeichert).
3. Die Datei wieder entfernen.
4. Eine Text- oder Bilddatei vorbereiten. Inhalt egal. Name: "ende".

Und so läuft es ab:
1. Die Dateien kommen im überwachten Ordner an.
2. Wenn der Job beendet ist, kopiert man die Datei namens "ende" in den Hotfolder.
3. Erst jetzt wird der Handler 'moveFiles' aufgerufen.
4. Der Finder verschiebt die Datei "ende" in den Papierkorb.
5. Mit 'list folder' wird die Liste der Dateinamen erstellt.
6. Eine Wiederholungsschleife geht durch diese Liste, das Änderungsdatum der aktuellen Datei wird gespeichert.
7. Der Name der aktuellen Datei und die Zeit des Änderungsdatums werden laufend an eine Liste gehängt.
8. Anschliessend wird diese Liste sortiert und zwar basierend auf der Zeit (Element 2 jedes Elements).
9. Eine letzte Wiederholungsschleife geht durch die Liste. Bei jedem Umgang wird an den Pfad des Ordners
der Name der aktuellen Datei gehängt (Element 1 jedes Elements) und der Finder verschiebt die Datei in den
Zielordner. Der Befehl 'delay 30' sorgt jedes Mal für 30 Sekunden Pause.
---
on adding folder items to sourceFolder after receiving itemList
   set targetPath to (path to preferences as Unicode text) & "targetPath.txt"
   try
      set targetFolder to read file targetPath as Unicode text
   on error
      with timeout of 300 seconds
         set targetFolder to (choose folder with prompt "Einen Zielordner für die Dateien wählen.") as Unicode text
      end timeout
      writePath(targetFolder)
   end try
   try
      targetFolder as alias
   on error
      with timeout of 300 seconds
         set targetFolder to (choose folder with prompt "Einen Zielordner für die Dateien wählen.") as Unicode text
      end timeout
      writePath(targetFolder)
   end try
   set aName to name of (info for item 1 of itemList) as string
   if aName is "ende" then
      moveFiles(sourceFolder)
   end if
end adding folder items to

on writePath(targetFolder)
   set targetPath to (path to preferences as Unicode text) & "targetPath.txt"
   try
      open for access file targetPath with write permission
      set eof of file targetPath to 0
      write targetFolder to file targetPath as Unicode text
      close access file targetPath
   on error
      try
         close access file targetPath
      end try
   end try
end writePath

on moveFiles(sourceFolder)
   set sourcePath to sourceFolder as Unicode text
   try
      tell application "Finder" to delete file (sourcePath & "ende")
   end try
   set targetPath to (path to preferences as Unicode text) & "targetPath.txt"
   set targetFolder to read file targetPath as Unicode text
   set fileList to list folder sourcePath without invisibles
   set defList to {}
   repeat with aFile in fileList
      set fileInfo to (info for file (sourcePath & aFile))
      set modDate to time of (modification date of fileInfo)
      set end of defList to {aFile, modDate}
   end repeat
   sortList(1, count of items of defList, defList, 2)
   repeat with i from 1 to count of defList
      delay 30
      set curPath to sourcePath & (item 1 of (item i of defList))
      try
         tell application "Finder" to move curPath to folder targetFolder with replacing
      end try
   end repeat
   display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
end moveFiles

on sortList(startWith1, itemCount, defList, elementToSortOn)
   set leftCounter to startWith1
   set rightCounter to itemCount
   set midItem to item elementToSortOn of (item ((startWith1 + itemCount) div 2) of defList)
   repeat until rightCounter is less than or equal to leftCounter
      repeat while item elementToSortOn of (item leftCounter of defList) is less than midItem
         set leftCounter to leftCounter + 1
      end repeat
      repeat while item elementToSortOn of (item rightCounter of defList) is greater than midItem
         set rightCounter to rightCounter - 1
      end repeat
      if leftCounter is less than or equal to rightCounter then
         set astore to item leftCounter of defList
         set item leftCounter of defList to item rightCounter of defList
         set item rightCounter of defList to astore
         set leftCounter to leftCounter + 1
         set rightCounter to rightCounter - 1
      end if
   end repeat
   if startWith1 is greater than rightCounter then
      my sortList(startWith1, rightCounter, defList, elementToSortOn)
   end if
   if itemCount is less than leftCounter then
      my sortList(leftCounter, itemCount, defList, elementToSortOn)
   end if
   return defList
end sortList

---
Ich werde Dir das Script zustellen und hoffe sehr, dass es klappen wird.

Gruss, Hans

Ordneraktion "first in first out"

Anonym
Beiträge gesamt: 22827

11. Nov 2005, 15:10
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die schnelle Reaktion. Leider werde ich es erst am Montag schaffen es auzutesten. Ich werde mich wieder melden.

Schönes Wochenende

Uwe

Ordneraktion "first in first out"

Anonym
Beiträge gesamt: 22827

14. Nov 2005, 14:30
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Hans,

ich habe mich gerade mit dem Script beschäftigt:
Unter Mac OS X 10.3.x läuft das Script zwar durch, aber die Dateien werden nicht in chronologischer Reihenfolge verschoben. Ich hatte z.B. 6 Dateien mit dem Änderungsdatum 13:20 Uhr? Kann es sein das das Script die Sekunden nicht miteinbezieht? Dann hatte ich 6 Dateien mit einem Änderungsdatum was sich jeweils um 1 Minuter unterschied - aber auch hier hatte ich keinen Erfolg.
Bei Bedarf kann ich Dir einmal ein paar Beispieldaten senden.

Gruß
Uwe

Ordneraktion "first in first out"

Hans Haesler
  
Beiträge gesamt: 5826

14. Nov 2005, 15:11
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Uwe,

dass das Script läuft, ist schon mal nicht schlecht ... ;-)

Doch, doch, die Sekunden werden miteinbezogen. Und zwar holt sich das Script das Änderungsdatum
der Datei und verlangt davon die 'time', d.h. die Sekunden, welche seit Mitternacht veflossen sind.

Mit meinen Testdateien hat es auf jeden Fall geklappt. Anstelle von Namen habe ich Nummern verwendet.
Die Reihenfolge stimmte. Und wenn ich die Namen austauschte, war das Verschieben wie erwartet.

Wie werden denn die Dateien verschoben? Willkürlich? Oder gibt es ein Muster?

Ja, ich hätte gerne ein paar Beispieldateien. Aber bevor Du mir sie schickst, werde ich ein Testscript
schreiben, welches Du dann abspielen und mir das Ergebnis samt den Dateien zustellen kannst.

Gruss, Hans

Ordneraktion "first in first out"

Hans Haesler
  
Beiträge gesamt: 5826

14. Nov 2005, 21:59
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Uwe,

das Rätsel ist gelöst. Das Problem ist im Sortierungs-Handler 'sortList'. Ich musste diesen
umpolen, damit die tieferen Werte an den Anfang der sortierten Liste gerückt werden. Zudem musste
ich die Symbole der Operatoren ausschreiben, weil der Server des Forums die komplizierten darunter
als Fragezeichen wiedergibt. Dabei habe ich eine Umkehrung zuviel gemacht. In den beiden Tests am
Schluss des Handlers müssen 'is greater than' und 'is less than' untereinander ausgetauscht werden.

Allerdings ist mir noch nicht klar, warum die Reihenfolge manchmal doch stimmt. Dennoch: Hier ist
der korrigierte Handler. Und: Entschuldige bitte mein Versehen.
---
on sortList(startWith1, itemCount, defList, elementToSortOn)
   set leftCounter to startWith1
   set rightCounter to itemCount
   set midItem to item elementToSortOn of (item ((startWith1 + itemCount) div 2) of defList)
   repeat until rightCounter is less than or equal to leftCounter
      repeat while item elementToSortOn of (item leftCounter of defList) is less than midItem
         set leftCounter to leftCounter + 1
      end repeat
      repeat while item elementToSortOn of (item rightCounter of defList) is greater than midItem
         set rightCounter to rightCounter - 1
      end repeat
      if leftCounter is less than or equal to rightCounter then
         set astore to item leftCounter of defList
         set item leftCounter of defList to item rightCounter of defList
         set item rightCounter of defList to astore
         set leftCounter to leftCounter + 1
         set rightCounter to rightCounter - 1
      end if
   end repeat
   if startWith1 is less than rightCounter then
      my sortList(startWith1, rightCounter, defList, elementToSortOn)
   end if
   if itemCount is greater than leftCounter then
      my sortList(leftCounter, itemCount, defList, elementToSortOn)
   end if
   return defList
end sortList

---
Ich werde Dir am Dienstagmorgen das korrigierte Script zustellen.

Gruss, Hans

Ordneraktion "first in first out"

Anonym
Beiträge gesamt: 22827

15. Nov 2005, 14:22
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Hans,

das Script läuft jetzt einwandfrei. Vielen Dank dafür. Jetzt liegt es an den nachfolgenden Programmen (Flightcheck WF, Photoshop, EFI) alles richtig zu verarbeiten. Ich bin mal gespannt welches Modul dann "quertreibt".

Vielen Dank nochmals und Grüße aus Ahaus

Uwe

Ordneraktion "first in first out"

Hans Haesler
  
Beiträge gesamt: 5826

15. Nov 2005, 14:55
Bewertung:

gelesen: 2980

Beitrag als Lesezeichen
Hallo Uwe,

bitteschön. Danke für die Rückmeldung. Die weiteren Akteure haben klingende Namen.
Da sollte doch nichts mehr schiefgehen. Gutes Gelingen! :-)

Gruss, Hans