2015-04-08 19 views
14

Von dem, was ich sehe, erscheinen Netzwerk-Laufwerke als Unterordner des Ordners/Volumes.Wie können Dateiänderungen auf Netzwerklaufwerken überwacht werden?

Was ist der richtige Weg, um Dateiänderungen Updates (löschen/erstellen/aktualisieren) von diesem Ordner zu erhalten?

Würde/dev/fsevents dafür arbeiten?

Woher kennt Finder die Änderungen?

+0

Wenn das File-Sharing-Protokoll eine Möglichkeit für den Server enthält, den Client über Änderungen zu informieren (und ich kenne keine Protokolle, die dies tun), wird es nicht möglich sein. –

+0

Das macht Sinn, aber trotzdem: Wie macht der Finder das? – Jamie

+0

@Gordon - NTFS und SMB erlauben Clientbenachrichtigungen von Änderungen (sogar gemappte Netzlaufwerke, wenn es ein Windows-System ist, auf dem NTFS läuft). Aber die Linux-Maschinen, mit denen ich SAMBA gestartet habe, feuern das Ereignis nicht ab. Es ist also so, als ob nur Microsoft das Feature zur Verfügung stellt, obwohl jeder Anbieter es anbieten könnte. – jww

Antwort

2

Sie richtig sind, OS X besteigt die Netzlaufwerke in/Volumes

Die Art und Weise Dateiänderung Updates zu erhalten ist File System Events API zu verwenden. Es ist eine C-basierte API, wo Sie alle Änderungen in bestimmten Verzeichnissen (oder sogar /) überwachen würden.

Sie würden den Stream mit FSEventStreamCreate erstellen und starten Sie es mit FSEventStreamScheduleWithRunLoop

Seien Sie bereit, in die Header-Datei zu graben, da es mehr Dokumentation als in der Referenzdokumentation ist

Von dem, was ich sagen kann, verwendet Finder wahrscheinlich eine interne API oder die kernel queues die komplexen Setup sind als der höher-Level-API von FSEvents.h

Es gibt eine nette GUI zu helfen Sie sehen, wie die ganzen Ereignisse in kommen. Es heißt fseventer by fernlightning (noch nicht Yose Milbe bereit)

2

Sie können fswatch verwenden, die ich am einfachsten über homebrew installieren kann. Und ja, es verwendet FSEvents. Dann tun Sie gerade:

fswatch /Volumes/MUSIC 

wo MUSIC ein Samba-basierten Musik-Server in meinem Netzwerk.

Hier ist, wie es in Aktion aussieht ... zuerst zeige ich die gemounteten Volumes (und das MUSIC ist Samba basiert) im oberen Fenster, dann starte ich fswatch im unteren linken Fenster, dann mache ich Änderungen im Dateisystem im oberen Fenster und Sie können sehen, dass sie im Finder geschehen und sehen Sie auch im unteren linken Fenster, dass fswatch alle Ereignisse verfolgt.

enter image description here

Sie können es auch mit einem anderen Programm zu interagieren, wenn Ereignisse erkannt werden, wie dies (aus dem fswatch manpage extrahiert):

wahrscheinlich die einfachste Weg, um Rohr fswatch auf ein anderes Programm, um reagieren auf ein Ereignis ist mit xargs:

$ fswatch -0 [opts] [paths] | xargs -0 -n 1 -I {} [command] 
  • fswatch -0 teilt Datensätze mit dem NUL-Zeichen auf.

  • xargs -0 teilt Datensätze unter Verwendung des NUL-Zeichens auf. Dies ist erforderlich, um die Impedanz mit fswatch korrekt zu verbinden.

  • xargs -n 1 ruft den Befehl für jeden Datensatz auf. Wenn Sie alle x Datensätze verwenden möchten, verwenden Sie xargs -n x.

  • xargs -I {} ersetzt die Vorkommen von {} im Befehl mit dem analysierten Argument. Wenn der Befehl, den Sie ausführen, nicht den Namen des Ereignispfads benötigt, löschen Sie diese Option. Wenn Sie eine andere Ersatzzeichenfolge verwenden möchten, ersetzen Sie {} durch Ihre.

+0

Vielen Dank für das detaillierte fswatch-Nutzungsbeispiel! Ich habe das aus der Sicht eines Entwicklers gefragt, aber aus der Sicht eines Anwenders ist Ihre Antwort großartig. – Jamie

+0

@Mark kann 'fswatch' funktionieren, wenn Dateien auf einem Remote-Computer geändert werden, der über ein zugeordnetes Volume für MacOS verfügt? Ich habe eine Windows-Netzwerkkarte und 'fswatch' funktioniert, wenn ich eine Datei von der Mac-comp in dieses Verzeichnis ändere, aber es zeigt nichts an, wenn ich eine Datei mit dem Windows-Rechner auf dem physischen Pfad ändere. –

+0

@ChristosLytras Sorry, ich weiß nicht - ich versuche generell, Windows zu vermeiden. –