File and Dir class problems

I’m running into some problems when renaming and deleting files through
ruby. Originally I built a function to rename certain directories.
However when renaming a directory that has folders, files, and
subfolders inside, I get the ENOTEMPTY “Directory Not Empty” error -
even if the directory being renamed is the only directory inside the
parent folder.

In order to by-pass this problem I decided to program it manually using
a recursive copy and then a recursive delete. However when I do the
recursive delete, I get the same error for folders that have subfolders
and files inside (and I am deleting all sub-folders/files first before
deleting the parent folder, but the parent folder is the one throwing
the error!).

I don’t get it. It almost seems as though the commands are executing
too fast - before the file system has time to recognize that the folders
are empty.

This is driving me absolutely bonkers, so if there is anyone that has
experienced the same thing or has some suggestions, I would greatly
appreciate it!

For reference, here is the code I used for the recursive delete:
The “Me” folder contains several folders + subfolders and several files.
So, for example:

/Me/

  • /fullsize/
    • /folder2/
    • image.png
    • image 2.png
  • /scaled/
    • image3.png
    • simpsoneatsdonuts.png

etc.

path = “/Users/eagle/Desktop/Me/”

files = Array.new
everything = Array.new

get all the files

files << Dir.glob(path + “/.*”)

get all files/folders

everything << Dir.glob(path + “//”)

files.flatten!
everything.flatten!

get the folders

folders = everything - files

make sure sub-directories appear before parent directories

folders.reverse!

loop through each file and delete

files.each {|file|
puts file
File.delete(file)
}

p “-----------”

loop through each directory and delete

folders.each {|f|
puts f
Dir.delete(f)
}

now delete the base folder

Dir.delete(path)

On Jan 8, 4:25 pm, Spencer R. [email protected] wrote:

and files inside (and I am deleting all sub-folders/files first before

 - image3.png

files << Dir.glob(path + “/.*”)

puts f
Dir.delete(f)
}

now delete the base folder

Dir.delete(path)

Posted viahttp://www.ruby-forum.com/.

You’re thinking of FileUtils.rm_r
http://ruby-doc.org/core/classes/FileUtils.html#M004336

On Jan 8, 4:25 pm, Spencer R. [email protected] wrote:

and files inside (and I am deleting all sub-folders/files first before

 - image3.png

files << Dir.glob(path + “/.*”)

puts f
Dir.delete(f)
}

now delete the base folder

Dir.delete(path)

Posted viahttp://www.ruby-forum.com/.

Also, files << Dir.glob(path + “/.*”) does not glob the list of
files; it globs the list of filesystem entries that have a “.”
somewhere other than the beginning of the name. This is very different
from the complete list of files, and nothing at all stops a directory
name from containing a “.”

In a different scenario, when you actually do need to test if a given
file name is a file or a directory, use File.file? or File.directory?

stdlib is a prettttty nice thing to be acquainted with.

Thanks to both of you, those are all good points. It looks like I will
be able to do this without building my own function for it. And that was
a good catch with the glob. If I wanted, how would I return a list of
files going down to the nth sub-directory with glob?

Also, I found out that some of the files were set as read-only which
could be why the rename failed. I will give it another shot.

Hello Spencer,

2010/1/8 Spencer R. [email protected]:

Thanks to both of you, those are all good points. It looks like I will
be able to do this without building my own function for it. And that was
a good catch with the glob. If I wanted, how would I return a list of
files going down to the nth sub-directory with glob?

The problem with glob is that it doesn’t by default show the so-called
“hidden” files (which on Unix-like system have a name beginning with a
dot). If you want absolutely all the files, you should use the
‘entries’ method of a Dir object that get you the same result as a ‘ls
-a’, but then you also get ‘.’ (the current working directory) and
‘…’ (the parent directory) which you usually would want to get rid
of.

d = Dir.new(Dir.pwd)
=> #Dir:/Users/jfleck/cours/sites/pcsi
d.entries
=> [“.”, “…”, “.DS_Store”, “config.yaml”, “MD5SUM”, “MD5SUM_OLD”,
“metainfo.yaml”, “mise_a_jour_site_web_mpsi.rb”, “output”, “README”,
“src”, “truc”]

Cheers,