What is wrong with my code

0 views
Skip to first unread message

Li Chen

unread,
Oct 21, 2006, 6:31:11 PM10/21/06
to
Hi folks,

I write two srcipts to check files in a given directory. Version 1 uses
regular expression and works but I cann't find the size for each file.
Version 2 uses Ruby built-in File.file? method but it doesn't work at
all. I wonder what is going on with my scripts?

Thank you,

Li

#######Version 1:

path='c:\path\to\folder'
Dir.open(path).each do |file|
if file=~/(\w+|d+).(\d{3,})/
puts file
puts File.size(file)# this line doesn't work
file_number+=1
end
end

puts
puts 'Files',path
puts 'File number',file_number

#######Version2
path='c:\path\to\folder'
Dir.open(path).each do |file|
if File.file?(file)
puts file
puts File.size(file)
file_number+=1
end
end

puts
puts 'Files',path
puts 'File number',file_number

--
Posted via http://www.ruby-forum.com/.

Paul Lutus

unread,
Oct 21, 2006, 11:23:32 PM10/21/06
to
Li Chen wrote:

> Hi folks,
>
> I write two srcipts to check files in a given directory. Version 1 uses
> regular expression and works but I cann't find the size for each file.
> Version 2 uses Ruby built-in File.file? method but it doesn't work at
> all.

Explain. What error messages did you see? You need to provide more
information.

> I wonder what is going on with my scripts?
>
> Thank you,
>
> Li
>
> #######Version 1:
>
> path='c:\path\to\folder'

Don't use backslashes like this. Use forward slashes to avoid problems in
interpretation. Ruby will know what to do.

> Dir.open(path).each do |file|
> if file=~/(\w+|d+).(\d{3,})/
> puts file
> puts File.size(file)# this line doesn't work

"Doesn't work"? Please tell us what error message you saw. Maybe the "file"
was a directory?

--
Paul Lutus
http://www.arachnoid.com

camenix

unread,
Oct 22, 2006, 3:49:06 AM10/22/06
to

Use File.extend_path to convert path to absolute path.I think there is
something wrong with the file.

Robert Klemme

unread,
Oct 22, 2006, 9:03:42 AM10/22/06
to

Li Chen wrote:

> Hi folks,
>
> I write two srcipts to check files in a given directory. Version 1 uses
> regular expression and works but I cann't find the size for each file.
> Version 2 uses Ruby built-in File.file? method but it doesn't work at
> all. I wonder what is going on with my scripts?

So you want to sum sizes of all files in a directory hierarchy whose
names match a certain pattern. The pattern you use cannot be used with
Dir[] for filtering. So you better use find:

sum = 0
Find.find(path) do |f|
sum += File.size(f) if
/(\w+|d+).(\d{3,})/ =~ File.basename(f) && File.file?(f)
end

Note, your regexp might not match what you actually think it matches.
At the moment you match all file names that contain (!) at least a
single digit or word character followed by any character and then at
least three digits. I am guessing here but do you maybe rather want all
files that have a purely numeric file extension? In that case this
regexp would be better

/\.\d+$/

Regards

robert

Li Chen

unread,
Oct 22, 2006, 5:16:47 PM10/22/06
to
Robert Klemme wrote:
..

> So you want to sum sizes of all files in a directory hierarchy whose
> names match a certain pattern. The pattern you use cannot be used with
> Dir[] for filtering. So you better use find:
>
> sum = 0
> Find.find(path) do |f|
> sum += File.size(f) if
> /(\w+|d+).(\d{3,})/ =~ File.basename(f) && File.file?(f)
> end
>
..

Hi Robert,

Thank you very much for the code. Based on what I understand and what I
need I make some changes. But I still have some questions:1) How do I
factor the print or format codes here? 2) The outputs of the file are
in reverse order how do I print them out in this format; xxx.001,
xxx.002,...,xxx.026 3) what is the purpose of File.basename here?

Thanks,

Li


#dir6.rb find the file number in a folder
require 'find'

path='I:/Common/Gao/Notebooks/Flow/OT1/OTI-4'


file_number = 0
Find.find(path) do |f|
#sum += File.size(f) if
# /(\w+|d+).(\d{3,})/ =~ File.basename(f) && File.file?(f)
#puts f if /(\w+|d+).(\d{3,})/ =~ File.basename(f) && File.file?(f)
if File.file?(f) && f=~/(\w+|d+).(\d{3,})/
print f,"\t"
printf("%10s %10s", File.size(f),'byte' )
puts
file_number+=1
end
end

puts file_number

###screen output


I:/Common/Gao/Notebooks/Flow/OT1/OT1-typing-3/OT1-3.028 4796348
byte
...
I:/Common/Gao/Notebooks/Flow/OT1/OT1-typing-3/OT1-3.001 11877548
byte
28

Paul Lutus

unread,
Oct 22, 2006, 7:44:40 PM10/22/06
to
Li Chen wrote:

/ ...

> Thank you very much for the code. Based on what I understand and what I
> need I make some changes. But I still have some questions:1) How do I
> factor the print or format codes here?

Tell me what output you want to see and I will tell you how to get it.

> 2) The outputs of the file are
> in reverse order how do I print them out in this format; xxx.001,
> xxx.002,...,xxx.026

Push the items into an array, sort the array, print the sorted array.

> 3) what is the purpose of File.basename here?

File.basename gives either a filename without its preceding path, or a
filename without either its preceding path or its suffix, depending on
which options are exercised.

Because of the nature of your questions, I want to make you aware of a way
to get some answers on your own:

http://www.ruby-doc.org/

... and ...

http://www.ruby-doc.org/docs/ProgrammingRuby/

The second of these, which can also be downloaded, is a treasure trove of
information. It contains answers to a large percentage of your questions.

Li Chen

unread,
Oct 22, 2006, 8:39:05 PM10/22/06
to
Hi Paul,

Thank you very much. I have a Pickaxe but it is at home.

Li

Reply all
Reply to author
Forward
0 new messages