Como posso fazer com que um script seja executado quando um arquivo é excluído?

1

Eu tenho um aplicativo que salva seus dados na forma de 'jobfiles' XML que contêm listas de arquivos .tif muito maiores que contêm os dados brutos reais que o aplicativo gera. Normalmente, um usuário do aplicativo só se preocuparia com a localização do arquivo de trabalho XML: se isso for movido ou renomeado, a lista de arquivos .tif permaneceria válida, desde o caminho completo até eles (que geralmente estarão em uma unidade remota). dedicado para o propósito) é gravado dentro do arquivo de uma maneira transparente para o usuário. Ao fazer as coisas desta maneira, o arquivo de trabalho pode ser mantido pequeno em vez de aumentar para dezenas de Gigabytes.

No entanto, se o usuário decidir excluir o arquivo de trabalho do sistema operacional (ou seja, a partir de uma janela cmd ou do Windows Explorer no Windows ou de um bash shell ou do Nautilus no Linux), há o risco de caos devido a o link entre o arquivo de trabalho e seus dados de imagem sendo cortados. Os arquivos de imagem associados ao arquivo de trabalho serão 'órfãos', não mais acessíveis a partir do aplicativo, mas mesmo assim ocupando espaço na unidade.

Seria fácil escrever um script de shell que analisasse o arquivo XML, identificasse os arquivos de imagem listados nele e os excluísse. Garantir que este script de shell seja executado automaticamente sempre que o usuário excluir um arquivo resolveria meu problema de uma só vez. No entanto, eu não tenho absolutamente nenhuma idéia de como eu poderia configurar o sistema operacional para que ele pudesse executar o script sempre que um arquivo fosse excluído, seja no Windows ou no Linux.

Existe alguma maneira de fazer isso?

    
por Eos Pengwern 03.10.2015 / 00:28

1 resposta

0

Há uma porta do windows de inotifywait como mencionado nos comentários chamado inotify-win

Download:

link

Compile:

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

Uso:

$ 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

Editar:

Se você quiser evitar uma ação mal-intencionada, a solução pode ser icacls um sistema de arquivos NTFS

Para proteger um arquivo da exclusão:

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

Para proteger uma pasta com seu conteúdo, use:

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

*S-1-1-0 em vez de Everyone para independente de idioma, também %USERNAME% para o usuário atual.

    
por 03.10.2015 / 01:30