Wie kann ich veranlassen, dass ein Skript ausgeführt wird, wenn eine Datei gelöscht wird?

389
Eos Pengwern

Ich habe eine Anwendung, die ihre Daten in Form von XML-Jobdateien speichert, die Listen mit viel größeren TIF-Dateien enthalten, die die eigentlichen Rohdaten enthalten, die die Anwendung generiert. Normalerweise kümmert sich ein Benutzer der Anwendung nur um den Speicherort der XML-Auftragsdatei: Wenn diese verschoben oder umbenannt wird, bleibt die Liste der TIF-Dateien gültig, da der vollständige Pfad zu ihnen (der sich häufig auf einem Remote-Laufwerk befindet) zu diesem Zweck) wird in der Datei auf eine für den Benutzer transparente Weise aufgezeichnet. Auf diese Weise kann die Jobdatei klein gehalten werden, anstatt sich auf mehrere zehn Gigabyte zu erhöhen.

Wenn der Benutzer jedoch beschließt, die Jobdatei aus dem Betriebssystem zu löschen (z. B. aus einem Cmd-Fenster oder Windows Explorer unter Windows oder aus einer Bash-Shell oder Nautilus unter Linux), besteht die Gefahr von Chaos aufgrund der Verbindung zwischen den beiden Die Jobdatei und ihre Bilddaten werden getrennt. Die mit der Jobdatei verknüpften Image-Dateien werden "verwaist" und können nicht mehr von der Anwendung aus aufgerufen werden, sie beanspruchen jedoch immer noch Speicherplatz auf der Festplatte.

Es wäre leicht genug, ein Shell-Skript zu schreiben, das die XML-Datei analysiert, die darin aufgelisteten Bilddateien identifiziert und sie löscht. Wenn Sie sicherstellen, dass dieses Shell-Skript automatisch ausgeführt wird, wenn der Benutzer eine Datei löscht, würde dies mein Problem sofort lösen. Ich habe jedoch keine Ahnung, wie ich das Betriebssystem so konfigurieren kann, dass es das Skript jedes Mal ausführt, wenn eine Datei gelöscht wird, entweder unter Windows oder Linux.

Gibt es überhaupt eine Möglichkeit, dies zu tun?

1
Sie können Beobachter verwenden, um einen Event- und Response-Ansatz zu implementieren. Sie müssen jedoch separate Versionen für Windows und Linux schreiben, da diese sehr unterschiedlich arbeiten. Für Windows würde ich eine .net-App schreiben, aber dieses Powershell-Skript sollte dies ebenfalls tun: https://gallery.technet.microsoft.com/scriptcenter/Powershell-FileSystemWatche-dfd7084b Frank Thomas vor 9 Jahren 1
Unter Linux würde man [inotifywait] (http://linux.die.net/man/1/inotifywait) verwenden. John1024 vor 9 Jahren 0
Vielen Dank; Soweit ich sehen kann, dass sowohl die FileSystemWatcher-Klasse in .Net als auch die inotify-API in Linux gesendet werden, wird die Datei gelöscht, nachdem die Datei gelöscht wurde. Zu diesem Zeitpunkt ist es zu spät, um die Tabelle der darin enthaltenen Bilddateien zu lesen (es sei denn, ich kann es vorübergehend aus dem Papierkorb wiederherstellen). Was ich gehofft hatte zu finden, ist ein Weg, um das Skript aufzurufen, nachdem der Benutzer die Löschung angefordert hat. Vor dem eigentlichen Löschvorgang (ein bisschen wie bei einem C ++ - Destruktor) findet also der Inhalt der zu löschenden Datei statt kann noch gelesen werden. Eos Pengwern vor 9 Jahren 0
Dazu müssen Sie die Windows-API einbinden. Ich bin nicht wirklich sicher, dass es möglich ist, aber Sie möchten das Standard-API-Verhalten unterbrechen. Wenn Sie also keinen Haken haben, ist das sehr schwierig. Frank Thomas vor 9 Jahren 0

1 Antwort auf die Frage

0
Paul

Es gibt einen Windows-Port inotifywaitwie in den genannten Kommentaren erwähntinotify-win

Herunterladen:

https://github.com/thekid/inotify-win/archive/master.zip

Kompilieren:

%WINDIR%\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:inotifywait.exe src\*.cs 

Verwendungszweck:

$ inotifywait.exe Usage: inotifywait [options] path [...]  Options: -r/--recursive: Recursively watch all files and subdirectories inside path -m/--monitor: Keep running until killed (e.g. via Ctrl+C) -q/--quiet: Do not output information about actions -e/--event list: Events (create, modify, delete, move) to watch,  comma-separated. Default: all --format format: Format string for output. --exclude: Do not process any events whose filename matches the specified regex --excludei: Ditto, case-insensitive  Formats: %e : Event name %f : File name %w : Path name %T : Current date and time 

Bearbeiten:

Wenn Sie eine schädliche Aktion vermeiden möchten, befindet sich die Lösung möglicherweise icaclsin einem NTFS-Dateisystem

So schützen Sie eine Datei vor dem Löschen:

icacls file.ext /deny Everyone:(DE) rem To reset icacls file.ext /reset 

Um einen Ordner mit seinem Inhalt zu schützen, verwenden Sie Folgendes:

icacls folder /deny Everyone:(OI)(CI)(DE,DC) rem To reset icacls folder /reset 

*S-1-1-0statt Everyonefür sprachunabhängig, auch %USERNAME%für den aktuellen Benutzer.

Danke, aber bitte sehen Sie meinen Kommentar unter der ursprünglichen Frage. Eos Pengwern vor 9 Jahren 0