# File and Dir class problems

**URL:** <https://www.ruby-forum.com/t/file-and-dir-class-problems/181295>\
**Category:** Ruby\
**Created:** [January 8, 2010, 10:25pm UTC](https://www.ruby-forum.com/t/file-and-dir-class-problems/181295 "2010-01-08T22:25:02Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![spencer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8dc957/32.png) [@spencer](https://www.ruby-forum.com/u/spencer)\
**Post date:** [January 8, 2010, 10:25pm UTC](https://www.ruby-forum.com/t/file-and-dir-class-problems/181295/1 "2010-01-08T22:25:02Z")

</div>

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)

---

<div class="post-metadata">

**Author:** ![spencer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8dc957/32.png) [@spencer](https://www.ruby-forum.com/u/spencer)\
**Post date:** [January 8, 2010, 10:57pm UTC](https://www.ruby-forum.com/t/file-and-dir-class-problems/181295/2 "2010-01-08T22:57:18Z")

</div>

On Jan 8, 4:25 pm, Spencer R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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](http://ruby-doc.org/core/classes/FileUtils.html#M004336)

---

<div class="post-metadata">

**Author:** ![spencer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8dc957/32.png) [@spencer](https://www.ruby-forum.com/u/spencer)\
**Post date:** [January 8, 2010, 11:00pm UTC](https://www.ruby-forum.com/t/file-and-dir-class-problems/181295/3 "2010-01-08T23:00:49Z")

</div>

On Jan 8, 4:25 pm, Spencer R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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.

---

<div class="post-metadata">

**Author:** ![spencer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8dc957/32.png) [@spencer](https://www.ruby-forum.com/u/spencer)\
**Post date:** [January 8, 2010, 11:32pm UTC](https://www.ruby-forum.com/t/file-and-dir-class-problems/181295/4 "2010-01-08T23:32:46Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![spencer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8dc957/32.png) [@spencer](https://www.ruby-forum.com/u/spencer)\
**Post date:** [January 9, 2010, 8:57am UTC](https://www.ruby-forum.com/t/file-and-dir-class-problems/181295/5 "2010-01-09T08:57:07Z")

</div>

Hello Spencer,

2010/1/8 Spencer R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

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