FileUtils.mv behaving not as documented

A

Alex DeCaria

The documentation for FileUtils.mv(src, dest) says that if src and dest
are on different disk partitions then it is supposed to act as a copy
instead. But when I use it to copy a file from the "C:" drive to a
flash drive or mp3 player using another drive letter such as "E:" it
moves it and doesn't copy it as advertised. Is this a bug, or is the
documentation incorrect? I am using Ruby 186-26 on Windows.

-Alex
 
R

Rob Biedenharn

The documentation for FileUtils.mv(src, dest) says that if src and
dest
are on different disk partitions then it is supposed to act as a copy
instead. But when I use it to copy a file from the "C:" drive to a
flash drive or mp3 player using another drive letter such as "E:" it
moves it and doesn't copy it as advertised. Is this a bug, or is the
documentation incorrect? I am using Ruby 186-26 on Windows.

-Alex


I think that the difference the documentation is attempting to point
out is that a mv on a single partition just changes names and pointers
in directory entries so it makes no difference the size of the file.
On different partitions, the size of the file will matter because the
effect is a copy followed by an unlink of the original file.

If you want to copy, call FileUtils.cp
If you want to move, continue to call FileUtils.mv

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
 
A

Alex DeCaria

Rob said:
I think that the difference the documentation is attempting to point
out is that a mv on a single partition just changes names and pointers
in directory entries so it makes no difference the size of the file.
On different partitions, the size of the file will matter because the
effect is a copy followed by an unlink of the original file.

If you want to copy, call FileUtils.cp
If you want to move, continue to call FileUtils.mv

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)

Thanks. Can you explain another curious bit of behavior I've noticed?
I found that if I use the FileUtil.cp(src, dest) to copy a large file
from say the C: to the E: drive, it takes much longer than if I first
use FileUtil.cp(src, tmp) to copy the file to a temporary directory on
the C: drive and then use FileUtil.mv(tmp, dest) to move the file from
the temporary directory to the E: drive. This has the same result as
just doing FileUtil.cp(src, dest), but takes much less time. If I'm
doing this on a lot of files the time saving is significant, but I don't
understand why.

In other words, if I do

FileUtil.cp("C:/somefile", "C:/Temp/somefile")
FileUtil.mv("C:/Temp/somefile", "E:/")

it is faster than if I do

FileUtil.cp("C:/somefile", "E:/")

-Alex
 
R

Rob Biedenharn

Thanks. Can you explain another curious bit of behavior I've noticed?
I found that if I use the FileUtil.cp(src, dest) to copy a large file
from say the C: to the E: drive, it takes much longer than if I first
use FileUtil.cp(src, tmp) to copy the file to a temporary directory on
the C: drive and then use FileUtil.mv(tmp, dest) to move the file from
the temporary directory to the E: drive. This has the same result as
just doing FileUtil.cp(src, dest), but takes much less time. If I'm
doing this on a lot of files the time saving is significant, but I
don't
understand why.

In other words, if I do

FileUtil.cp("C:/somefile", "C:/Temp/somefile")
FileUtil.mv("C:/Temp/somefile", "E:/")

it is faster than if I do

FileUtil.cp("C:/somefile", "E:/")

-Alex


I'm making an educated guess (but it is nonetheless speculation) that
the underlying operating-system-level code that implements mv is using
a better buffer or at least tighter code which the implementation of
cp uses some higher-level Ruby code (or a different/smaller buffer).
It's also possible that Windows does something quite different between
cp and mv.

If you're truly interested, dig into the code and find out the
differences yourself. (I don't work on the Windows platform so I have
no direct access [or interest].)

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top