What is it about File.rename?

P

Peter Bailey

Hello,
I'm going a bit nuts with a script of mine that doesn't seem to behave
with file renaming. I've got 172 files in a directory, all with the
extension ".pstxt."

1. Dir.glob("*.pstxt").each do |pstxtfile|
2. $ps2kfile = File.basename(pstxtfile, ".pstxt")
3. $filetime = File.stat(pstxtfile).mtime
4. #$filetime = $filetime.to_s.gsub!(/ -0500.*$/, "")
5. #$totalpages = IO::readlines(pstxtfile).to_s
6. #$totalpages = $totalpages.to_s.chomp!

...

20. File.rename(pstxtfile, pstxtfile.to_s.gsub(/(^.*)\.pdf\.pstxt/,
"ps2k_#{$1}.pstxt"))

...

The above works fine and renames all 172 files in the directory at
present. But, if I uncomment line number 4 and/or 5 and/or 6, it runs
and gives me the following one entry remaining in my directory:

ps2k_.pstxt

All the 172 files are gone! This doesn't make sense to me. The
"filetime" variables are to be used in something completely different
and I don't see why they're affecting this simple renaming of files.

Thanks,
Peter
 
D

David Mullet

Peter said:
Hello,
I'm going a bit nuts with a script of mine that doesn't seem to behave
with file renaming. I've got 172 files in a directory, all with the
extension ".pstxt."

1. Dir.glob("*.pstxt").each do |pstxtfile|
2. $ps2kfile = File.basename(pstxtfile, ".pstxt")
3. $filetime = File.stat(pstxtfile).mtime
4. #$filetime = $filetime.to_s.gsub!(/ -0500.*$/, "")
5. #$totalpages = IO::readlines(pstxtfile).to_s
6. #$totalpages = $totalpages.to_s.chomp!

...

20. File.rename(pstxtfile, pstxtfile.to_s.gsub(/(^.*)\.pdf\.pstxt/,
"ps2k_#{$1}.pstxt"))

...

The above works fine and renames all 172 files in the directory at
present. But, if I uncomment line number 4 and/or 5 and/or 6, it runs
and gives me the following one entry remaining in my directory:

ps2k_.pstxt

All the 172 files are gone! This doesn't make sense to me. The
"filetime" variables are to be used in something completely different
and I don't see why they're affecting this simple renaming of files.

Thanks,
Peter

Just a thought...

If I recall correctly, gsub! returns nil if no substitution was made.

Does changing...

$filetime = $filetime.to_s.gsub!(/ -0500.*$/, "")

...to...

$filetime = $filetime.to_s.gsub(/ -0500.*$/, "")

...have any effect?

David

http://rubyonwindows.blogspot.com
 
P

Peter Bailey

David said:
Just a thought...

If I recall correctly, gsub! returns nil if no substitution was made.

Does changing...

$filetime = $filetime.to_s.gsub!(/ -0500.*$/, "")

...to...

$filetime = $filetime.to_s.gsub(/ -0500.*$/, "")

...have any effect?

David

http://rubyonwindows.blogspot.com

Thanks, David. Well, yeh, it does appear that the filetime stuff was
messing me up. This is fairly old code, for me, meaning 3 or 4 months
old, so, I modernized that filetime stuff a bit and now it seems to
work! I basically just simplified it by changing:

$filetime = File.stat(pstxtfile).mtime

to

$filetime = File.mtime(pstxtfile)

Thanks again!
-Peter
 
R

Rick DeNatale

Hello,
I'm going a bit nuts with a script of mine that doesn't seem to behave
with file renaming. I've got 172 files in a directory, all with the
extension ".pstxt."

1. Dir.glob("*.pstxt").each do |pstxtfile|
2. $ps2kfile = File.basename(pstxtfile, ".pstxt")
3. $filetime = File.stat(pstxtfile).mtime
4. #$filetime = $filetime.to_s.gsub!(/ -0500.*$/, "")
5. #$totalpages = IO::readlines(pstxtfile).to_s
6. #$totalpages = $totalpages.to_s.chomp!

...

20. File.rename(pstxtfile, pstxtfile.to_s.gsub(/(^.*)\.pdf\.pstxt/,
"ps2k_#{$1}.pstxt"))

I think that your problem is here. String#gsub with a string
replacement doesn't provide the use of $1 in the replacement string.
I'm not sure why it's working when it does. Something before thoses
lines seems to be setting $1 to what you are expecting, Line 4 is
going to reset $1 to nil since it doesn't capture anything.

Try replacing line 20 with either
File.rename(pstxtfile, pstxtfile.to_s.gsub(/(^.*)\.pdf\.pstxt/,
"ps2k_\1.pstxt"))

or

File.rename(pstxtfile, pstxtfile.to_s.gsub(/(^.*)\.pdf\.pstxt/)
{"ps2k_#{$1}.pstxt")}
 
R

Rick DeNatale

Try replacing line 20 with either
File.rename(pstxtfile, pstxtfile.to_s.gsub(/(^.*)\.pdf\.pstxt/,
"ps2k_\1.pstxt"))

Oops that should be "ps2k_\\1.pstxt" or 'ps2k_\1.pstxt' The double
quote string will interpret a single slash as an escape of the next
character.
 

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

Forum statistics

Threads
473,969
Messages
2,570,161
Members
46,708
Latest member
SherleneF1

Latest Threads

Top