views:

513

answers:

1

I need to delete an application (MyApp.app), which has read only permissions in all its enclosed folders. Before I delete it, I should change the permissions on all enclosed files/directories to 0644. How do I do this recursively?

I've tried

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

but FileUtils.chmod doesn't work recursively. I cannot use Unix commands - it has to be Ruby.

EDIT: I cannot use Unix commands in the current context. OK, this is a RubyCocoa application and the source you see is a part of ruby script, that is supposed to uninstall the application (please don't comment on that, since that's the code my customer has). Uninstalling includes removing all traces of the application, killing the process and in the end deleting the application itself. Normally it works, but not in the case when for some reason the MyApp.app folder gets read only permission. So i thought to run a chmod recursively on the folder and them remove it, but it's not straight forward in Ruby for some reason. That's why i'm asking for a help. There are plenty examples on how to do it from a command line, but how do you do it from the code?

Here some more from the code, just to show how's it implemented:

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}}

Thanks again.

+4  A: 

FileUtils.chmod_R should do it

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

-- EDIT --

seth@oxygen ~ $ mkdir -p foo/bar/seth

seth@oxygen ~ $ ls -ld foo
drwxr-xr-x  3 seth  staff  102 Oct 15 19:24 foo

seth@oxygen ~ $ ls -ld foo/bar
drwxr-xr-x  3 seth  staff  102 Oct 15 19:24 foo/bar

seth@oxygen ~ $ ls -ld foo/bar/seth
drwxr-xr-x  2 seth  staff  68 Oct 15 19:24 foo/bar/seth

seth@oxygen ~ $ cat test.rb
require 'fileutils'
begin; FileUtils.chmod_R(0777, 'foo'); rescue; end

seth@oxygen ~ $ ruby test.rb

seth@oxygen ~ $ ls -ld foo
drwxrwxrwx  3 seth  staff  102 Oct 15 19:24 foo

seth@oxygen ~ $ ls -ld foo/bar
drwxrwxrwx  3 seth  staff  102 Oct 15 19:24 foo/bar

seth@oxygen ~ $ ls -ld foo/bar/seth
drwxrwxrwx  2 seth  staff  68 Oct 15 19:24 foo/bar/seth

A quick test appears to work.

Seth
It doesn't do it recursively for some reason.
Nava Carmon
I'll be sure to make the same test on my side. Will let you know.Thanks
Nava Carmon
@Seth, thank you very much, it worked! For some reason when i tried it it didn't, but probably i didn't use it right.
Nava Carmon