Forum: Ruby Creating directory structures

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
F3be80254c63fb37ccb1bfc5a3794d1b?d=identicon&s=25 Ch Ba (navouri)
on 2008-12-13 06:03
I'm having a bit of a difficult time coming up with a solid way handle
this problem. I'll explain:

I have an array containing a list of file paths like the following.

["foo/bar/blah.rb","foo/bar/stuff.rb","foo/bar/example/thing.rb,"foo/ham/example"]

I need to come up with a way to create a directory structure using the
paths supplied in the array. The "base" directory is unimportant, but
the structure of the rest is. Using the above as an example, I would
need to create the following directories.

foo/bar
foo/bar/example
foo/ham
foo/ham/example

I also need to check whether or not the directory exists so that it
makes no attempt to create a directory that is already there. Any ideas?
A61ecce13ed142622f24a5ca3a123922?d=identicon&s=25 Matthew Moss (Guest)
on 2008-12-13 06:21
(Received via mailing list)
On Dec 12, 2008, at 10:56 PM, Ch Ba wrote:

> the structure of the rest is. Using the above as an example, I would
> need to create the following directories.
>
> foo/bar
> foo/bar/example
> foo/ham
> foo/ham/example
>
> I also need to check whether or not the directory exists so that it
> makes no attempt to create a directory that is already there. Any
> ideas?



FileUtils.makedirs( files.map{ |f| f.dirname }.uniq.reject{ |d|
File::exist?(d) } )
F3be80254c63fb37ccb1bfc5a3794d1b?d=identicon&s=25 Ch Ba (navouri)
on 2008-12-13 06:37
Matthew Moss wrote:

> FileUtils.makedirs( files.map{ |f| f.dirname }.uniq.reject{ |d|
> File::exist?(d) } )

I've got to be honest, I was looking for more of a
discussion/explanation than code itself. I greatly appreciate your
prompt response and you putting it together but my application is a bit
more advanced than I led on and what I really need is to better
understand how to do it =)
F3be80254c63fb37ccb1bfc5a3794d1b?d=identicon&s=25 Ch Ba (navouri)
on 2008-12-13 10:53
Ch Ba wrote:
> I'm having a bit of a difficult time coming up with a solid way handle
> this problem. I'll explain:
>
> I have an array containing a list of file paths like the following.
>
> ["foo/bar/blah.rb","foo/bar/stuff.rb","foo/bar/example/thing.rb,"foo/ham/example"]
>
> I need to come up with a way to create a directory structure using the
> paths supplied in the array. The "base" directory is unimportant, but
> the structure of the rest is. Using the above as an example, I would
> need to create the following directories.
>
> foo/bar
> foo/bar/example
> foo/ham
> foo/ham/example
>
> I also need to check whether or not the directory exists so that it
> makes no attempt to create a directory that is already there. Any ideas?


Maybe the whole array idea is just bad altogether. I'll start from the
top and explain what I'm trying to do.

Starting with a base directory, we will say "foo", I need to iterate
through all subdirectories, gathering only files that contain certain
characters in their name. That part was easy, and it is returning the
array like I mentioned previously. Should I be doing it differently?
 After gathering the files, a new file is created for each file
gathered, and placed in a seperate location, with a new base directory.
The structure of the subdirectories must be maintained however. I'm
having an immensly difficult time getting this to work. I've tried
several different options, what do you guys think the best way to handle
this task would be?
A61ecce13ed142622f24a5ca3a123922?d=identicon&s=25 Matthew Moss (Guest)
on 2008-12-13 15:45
(Received via mailing list)
> Starting with a base directory, we will say "foo", I need to iterate
> through all subdirectories, gathering only files that contain certain
> characters in their name. That part was easy, and it is returning the
> array like I mentioned previously. Should I be doing it differently?

That seems like a quite reasonable way to do it.


> After gathering the files, a new file is created for each file
> gathered, and placed in a seperate location, with a new base
> directory.
> The structure of the subdirectories must be maintained however. I'm
> having an immensly difficult time getting this to work. I've tried
> several different options, what do you guys think the best way to
> handle
> this task would be?

Once you have an array of the source files, you should be able to
create a list of the potential new files by replacing part of the
source paths (using String#gsub).

After that, enumerate your files, creating the directory (using
File.dirname) and then creating the file.
F3be80254c63fb37ccb1bfc5a3794d1b?d=identicon&s=25 Ch Ba (navouri)
on 2008-12-13 18:13
> Once you have an array of the source files, you should be able to
> create a list of the potential new files by replacing part of the
> source paths (using String#gsub).
>
> After that, enumerate your files, creating the directory (using
> File.dirname) and then creating the file.

Excellent. That's what I'm looking for, I will follow up with my
results.
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2008-12-14 11:05
(Received via mailing list)
On 13.12.2008 18:09, Ch Ba wrote:
>> Once you have an array of the source files, you should be able to
>> create a list of the potential new files by replacing part of the
>> source paths (using String#gsub).
>>
>> After that, enumerate your files, creating the directory (using
>> File.dirname) and then creating the file.
>
> Excellent. That's what I'm looking for, I will follow up with my
> results.

There is another option that does not need gsub: use Dir[] with a
directory wildcard and then just prepend source and target dir.  Also,
you can use FileUtils.mkdir_p which handles intermediate as well as
existing directories gracefully.

Cheers

  robert

# ============= SPOILER BELOW =======================
















































require 'fileutils'

Dir.chdir source_dir do
   Dir['**/*special*characters*']
end.each do |file|
   from = File.join(source_dir, file)

   if must_transform? from
     to = File.join(target_dir, file)
     FileUtils.mkdir_p(File.dirname(to))
     transform(from, to)
   end
end
This topic is locked and can not be replied to.