What is wrong with my code

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/.

file in those cases should just be the file name, without the path info. So
unless the directory you've opened is your current directory,
File.sizewon't work right. Try
File.size(File.join(path, file)) (same goes for File.file?)

-Scott

···

On 10/21/06, Li Chen <chen_li3@yahoo.com> 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?

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/\.

Dir.each returns the file, without the path information. You'll need to
prepend that and using File.join is a good way to do it.

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

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/\.

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

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

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

···

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

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:

... 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.

···

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

Hi Paul,

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

Li

···

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