Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

What is wrong with my code

13 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

0 new messages