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
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
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?
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
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
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
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: