2009-10-14 6 views
1

J'ai besoin de supprimer une application (MyApp.app), qui a des autorisations en lecture seule dans tous ses dossiers joints. Avant de le supprimer, je devrais changer les permissions sur tous les fichiers/répertoires joints en 0644. Comment faire ceci de manière récursive?Chmod récursif dans ruby ​​sur Mac OS X?

J'ai essayé

begin; FileUtils.chmod(0644, '#{config.appPath}'); rescue; end 
begin; FileUtils.rm_r('#{config.appPath}'); rescue; end 

mais FileUtils.chmod ne fonctionne pas de manière récursive. Je ne peux pas utiliser les commandes Unix - ça doit être Ruby.

EDIT: Je ne peux pas utiliser les commandes Unix dans le contexte actuel. OK, il s'agit d'une application RubyCocoa et la source que vous voyez est une partie du script ruby, qui est censée désinstaller l'application (s'il vous plait, ne faites pas de commentaire, puisque c'est le code que mon client a). La désinstallation inclut la suppression de toutes les traces de l'application, la destruction du processus et, à la fin, la suppression de l'application elle-même. Normalement, cela fonctionne, mais pas dans le cas où, pour une raison quelconque, le dossier MyApp.app obtient l'autorisation de lecture seule. J'ai donc pensé à exécuter un chmod récursivement sur le dossier et à le supprimer, mais ce n'est pas simple dans Ruby pour une raison quelconque. C'est pourquoi je demande de l'aide. Il existe de nombreux exemples sur la façon de le faire à partir d'une ligne de commande, mais comment le faites-vous à partir du code?

Voici un peu plus du code, juste pour montrer comment est il mis en œuvre:

code =<<FOO 
require 'fileutils' 
# kill the app before deleting files in case it writes files on exit 
%x{/bin/kill -9 #{NSProcessInfo.processInfo.processIdentifier}} 
begin; FileUtils.chmod(0644, '#{TBConfig.appPath}'); rescue; end 
begin; FileUtils.rm_r('#{TBConfig.appPath}'); rescue; end 
FOO 
    ff = Tempfile.new('timebridge') 
    ff.write(code) 
    ff.close 
    %x{/usr/bin/ruby #{ff.path}} 

Merci encore.

+2

Si vous ne faites que le supprimer de toute façon, à quoi sert-il de changer les permissions? –

+0

Lorsque vous dites que vous ne pouvez pas utiliser les commandes Unix *, je suis confus. Vous êtes sur OSX. Les commandes Unix fonctionnent parfaitement bien là-bas. Est-ce que ce sont les devoirs? (Au-delà, Jeff a raison: il n'y a aucune raison de modifier les permissions sur quelque chose que vous êtes sur le point de supprimer.) – Telemachus

+0

Si le fichier MyApp.app est en lecture seule sur tous les dossiers joints, je ne peux pas le supprimer. S'il vous plaît voir l'EDIT pour une meilleure explication. Non ce n'est pas un devoir ... –

Répondre

6

FileUtils.chmod_R devrait le faire

http://www.ruby-doc.org/core/classes/FileUtils.html#M004351

- EDIT -

[email protected] ~ $ mkdir -p foo/bar/seth 

[email protected] ~ $ ls -ld foo 
drwxr-xr-x 3 seth staff 102 Oct 15 19:24 foo 

[email protected] ~ $ ls -ld foo/bar 
drwxr-xr-x 3 seth staff 102 Oct 15 19:24 foo/bar 

[email protected] ~ $ ls -ld foo/bar/seth 
drwxr-xr-x 2 seth staff 68 Oct 15 19:24 foo/bar/seth 

[email protected] ~ $ cat test.rb 
require 'fileutils' 
begin; FileUtils.chmod_R(0777, 'foo'); rescue; end 

[email protected] ~ $ ruby test.rb 

[email protected] ~ $ ls -ld foo 
drwxrwxrwx 3 seth staff 102 Oct 15 19:24 foo 

[email protected] ~ $ ls -ld foo/bar 
drwxrwxrwx 3 seth staff 102 Oct 15 19:24 foo/bar 

[email protected] ~ $ ls -ld foo/bar/seth 
drwxrwxrwx 2 seth staff 68 Oct 15 19:24 foo/bar/seth 

Un test rapide semble fonctionner.

+0

Il ne le fait pas récursivement pour une raison quelconque. –

+0

Je vais être sûr de faire le même test de mon côté. Vous permettra de savoir. Merci –

+0

@Seth, merci beaucoup, cela a fonctionné! Pour une raison quelconque, quand je l'ai essayé, ce n'est pas le cas, mais je ne l'ai probablement pas utilisé correctement. –