From: nobu.nakada@... Date: 2002-09-16T12:29:16+09:00 Subject: [ruby-dev:18294] File.safe_unlink under non-DOSISH, Dir.makedirs, etc. なかだです。 ftools.rbのsafe_unlinkですが、削除しようとするファイル自体のパー ミッションが関係するのは、DOSISHなシステムだけなので、他の環境 では正しく動きません。 # MacOSもかな? それと、[ruby-talk:50306]の「なんでDirのメソッドじゃないの?」と いうのももっともな気がするので、Dirにも同じメソッドを持たせては どうでしょうか。 あとついでにrmdir -p相当のFile.rmdirsとか。 Index: lib/ftools.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/ftools.rb,v retrieving revision 1.8 diff -u -2 -p -w -r1.8 ftools.rb --- lib/ftools.rb 20 Jun 2002 08:59:59 -0000 1.8 +++ lib/ftools.rb 16 Sep 2002 03:21:07 -0000 @@ -114,4 +114,6 @@ class << File # unlink files safely + case RUBY_PLATFORM + when /mswin|mingw|bccwin|djgpp|os2|human/ def safe_unlink(*files) verbose = if files[-1].is_a? String then false else files.pop end @@ -125,5 +127,72 @@ class << File end + def rmdirs(*dirs) + verbose = if dirs[-1].is_a? String then false else dirs.pop end + begin + $stderr.print dirs.join(" "), "\n" if verbose + chmod 0777, *dirs + dirs.each(&Dir.method(:rmdir)) + rescue +# STDERR.print "warning: Couldn't unlink #{files.join ' '}\n" + end + end + else + def safe_unlink(*files) + verbose = if files[-1].is_a? String then false else files.pop end + $stderr.print files.join(" "), "\n" if verbose + unlinked = 0 + files.each do |file| + begin + unlinked += (type ||= File).unlink(file) + rescue Errno::EISDIR + type = Dir + redo + rescue Errno::EACCES + dir ||= dirname(file) + begin + unless (s = stat(dir)).writable? + chmod(s.mode | 0200, dir) + redo + end + rescue + end + rescue + end + end + unlinked + end + + def rmdirs(*dirs) + verbose = if dirs[-1].is_a? String then false else dirs.pop end + $stderr.print dirs.join(" "), "\n" if verbose + unlinked = 0 + dirs.each do |dir| + next unless FileTest.directory? dir + until dir == "." or dir == "/" + begin + unlinked += Dir.rmdir(dir) + rescue Errno::EACCES + parent = dirname(dir) + begin + unless (s = stat(parent)).writable? + chmod(s.mode | 0200, parent) + redo + end + rescue + break + end + rescue + break + end + dir = parent || dirname(dir) + parent = nil + end + end + unlinked + end + end + alias rm_f safe_unlink + alias rmpath rmdirs def makedirs(*dirs) @@ -164,3 +233,12 @@ class << File end + +class << Dir + define_method(:makedirs, &File.method(:makedirs)) + alias mkpath makedirs + + define_method(:rmdirs, &File.method(:rmdirs)) + alias rmpath rmdirs +end + # vi:set sw=2: -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦