Forum: Ruby Moving files with ruby...

0cb023654f46a6bd171405af6419baf6?d=identicon&s=25 darren kirby (Guest)
on 2006-08-24 01:26
(Received via mailing list)
Hello all,

A script I have written needs the ability to move files. I thought I
would be
clever and use File.rename(old, newdir + new) but this is giving me an
error:
`rename': Invalid cross-device link. I gather this is because I am
renaming
the file to a different partition.

So then I found FileUtils and used:
require 'fileutils'
include FileUtils
mv( old, new)

This is working but seems an overly verbose and convoluted way to move a
file.
I had a look at the fileutils.rb source and found this (for 'mv'):
# Moves file(s) +src+ to +dest+.  If +file+ and +dest+ exist on the
different
# disk partition, the file is copied instead

So I guess my real question is: is there a technical reason or some
arbitrary
reason there is no File.move() method that can handle this
transparently? I
would think it would be quite useful...

Any insight is appreciated,
-d
4db5dbdedcae4df2feca2f2d93330208?d=identicon&s=25 Paul Lutus (Guest)
on 2006-08-24 01:46
(Received via mailing list)
darren kirby wrote:

> Hello all,
>
> A script I have written needs the ability to move files. I thought I would
> be clever and use File.rename(old, newdir + new) but this is giving me an
> error: `rename': Invalid cross-device link. I gather this is because I am
> renaming the file to a different partition.

No, it is because you are trying to use "rename" to physically move a
file,
and the system is objecting to this misconception. File.rename can only
rename files, it cannot move them. It works only on one storage
device/volume/whatever.

> So then I found FileUtils and used:
> require 'fileutils'
> include FileUtils
> mv( old, new)
>
> This is working but seems an overly verbose and convoluted way to move a
> file.

Umm, compared to what? It moves the file using a method named "mv", just
like the Linux/Unix command of the same name.

> I had a look at the fileutils.rb source and found this (for 'mv'):
> # Moves file(s) +src+ to +dest+.  If +file+ and +dest+ exist on the
> # different disk partition, the file is copied instead

That is what "mv" does. If the new and old filenames and paths allow the
file to remain on the same device, a simple rename is carried out. If
not,
the file is copied to the destination and deleted from the source.

> So I guess my real question is: is there a technical reason or some
> arbitrary reason there is no File.move() method that can handle this
> transparently? I would think it would be quite useful...

It might be because not all operating systems on which Ruby can be
installed
know the "mv" operation as described above. Just a guess.
0cb023654f46a6bd171405af6419baf6?d=identicon&s=25 darren kirby (Guest)
on 2006-08-24 02:10
(Received via mailing list)
quoth the Paul Lutus:
> rename files, it cannot move them. It works only on one storage
> device/volume/whatever.

Well, I think that's pretty much what I said. If you 'rename' a file
from /somepath/somefile.txt to /someotherpath/somefile.txt within the
same
partition you have effectively 'moved' it haven't you...

> > So then I found FileUtils and used:
> > require 'fileutils'
> > include FileUtils
> > mv( old, new)
> >
> > This is working but seems an overly verbose and convoluted way to move a
> > file.
>
> Umm, compared to what? It moves the file using a method named "mv", just
> like the Linux/Unix command of the same name.

I am typically very impressed with how much you can do with a little
amount of
code in Ruby. For instance, I only had to add one line to add some
recursive
directory handling in my script:

From:
files += Dir.glob("*.#{t}")
To:
files += Dir.glob("**/*.#{t}")

Whereas to move a file, a fairly basic operation, I need four lines of
code:

require 'fileutils'
include FileUtils
cp(old, new )
rm (old)

I have to change "mv" to "cp" and add the "rm" because the old file is
not
automatically removed...

> > I had a look at the fileutils.rb source and found this (for 'mv'):
> > # Moves file(s) +src+ to +dest+.  If +file+ and +dest+ exist on the
> > # different disk partition, the file is copied instead
>
> That is what "mv" does. If the new and old filenames and paths allow the
> file to remain on the same device, a simple rename is carried out. If not,
> the file is copied to the destination and deleted from the source.

Right, I've got that...

> > So I guess my real question is: is there a technical reason or some
> > arbitrary reason there is no File.move() method that can handle this
> > transparently? I would think it would be quite useful...
>
> It might be because not all operating systems on which Ruby can be
> installed know the "mv" operation as described above. Just a guess.

I am just wondering because there are (AFAIK) other methods that handle
the
operation transparently even though the underlying OS does it
differently.

Not trying to troll, I am just curious...

-d
4828d528e2e46f7c8160c336eb332836?d=identicon&s=25 Robert Heiler (shevegen)
on 2006-08-24 04:13
well
system("mv #{file}")
is also possible ,)

include FileUtils isnt needed so that should reduce your
LOC by -1

Doesnt FileUtils have
mv(src, dest, options)
?

Anyway, why not this?

http://www.ruby-doc.org/core/classes/FileUtils.html#M002613
B2156f905dd13ec3f45123fbe0dc0f8f?d=identicon&s=25 Cliff Cyphers (Guest)
on 2006-08-24 05:31
(Received via mailing list)
Marc Heiler wrote:
> well
> system("mv #{file}")
> is also possible ,)

But not generic for cross-platform re-use.
0cb023654f46a6bd171405af6419baf6?d=identicon&s=25 darren kirby (Guest)
on 2006-08-24 06:01
(Received via mailing list)
quoth the Marc Heiler:
> well
> system("mv #{file}")
> is also possible ,)

I may be wrong, but I always had the impression that using a system
command to
do something available within the language is considered a kludge.

> include FileUtils isnt needed so that should reduce your
> LOC by -1

When I comment the line out I get:
undefined method `cp' for main:Object (NoMethodError)

> Doesnt FileUtils have
> mv(src, dest, options)
> ?

Yes, it does. But the thing is that if you are moving the file across
partitions it will only copy and not delete the original file. I will
not
know if we are moving cross-partition, so I have to use cp and rm...

> Anyway, why not this?
>
> http://www.ruby-doc.org/core/classes/FileUtils.html#M002613

From the link: "If file and dest exist on the different disk partition,
the
file is copied instead."

-d
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.