From: pharrington Date: 2010-01-09T07:00:05+09:00 Subject: Re: File and Dir class problems On Jan 8, 4:25 pm, Spencer Rogers wrote: > 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) > -- > 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.