From: daz Date: 2003-06-14T22:42:19+09:00 Subject: Re: problems with Net::FTP "John Jenniskens" wrote: > Hello, > > I want to make a program that transfers a lot of files to another computer > by means of FTP. I want to check if the target directory exist. I want to do > a chdir, and if I retrieve a status indicating the directory doesn't exist, > I want to issue a mkdir command. > > When I issue a chdir (or even a list) on a non existing file, Ruby stops: > V:/RUBY/lib/ruby/1.6/net/ftp.rb:129:in `getresp': 550 /abc: The system > cannot find the file specified. (Net::FTPPermError) > from V:/RUBY/lib/ruby/1.6/net/ftp.rb:137:in `voidresp' > from V:/RUBY/lib/ruby/1.6/net/ftp.rb:298:in `retrlines' > from V:/RUBY/lib/ruby/1.6/net/ftp.rb:285:in `mon_synchronize' > from V:/RUBY/lib/ruby/1.6/net/ftp.rb:285:in `retrlines' > from V:/RUBY/lib/ruby/1.6/net/ftp.rb:447:in `list' > > How can I avoid this stopping, and getting the status in my program? > > I'm using Ruby 1.6.6 on Windows2000. > > Kind regards, > > John Jenniskens > > Like ruby itself, many libraries provide classes of exceptions which can be handled by (a) rescue clause(s); usually within a begin / end block. Below, only permanent errors are trapped and the FTP#lastresp method is called to see what the trouble is. Your result above shows that a '550' response was received from the server for 'file/dir not found' so, if it's returned, a new directory is created and the chdir is retried. I just ran this on my 20MB of free virtual web-space that's doing nothing but being virtual at the moment with quite spectacular success. The Ruby crew (or crubies as they're never called :) who write these libraries are absolute stars because, without them, it wouldn't just take longer for us to write a script ..- more than likely, it wouldn't get started / finished at all. Thanks in this particular case (Net::FTP) go to Shugo Maeda. A few changes at the top for folks to make to personalise this. #<--start--> ### Personal FTP Log-In details - ((CHANGE)) MY_WEBSPACE_FTP = 'homepag#s.##########' ACCOUNT = nil # I'm a single user account (not used) USER = 'you' PASSWORD = 'opensesa-you' #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^# # --- S E C U R I T Y --- # #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^# Dir.chdir('C:\TEMP') # local temp-file directory ??? TEMP_FILENAME = 'test6.txt' FTP_DIR_NAME = 'rbjun14' # File to browse will be: # (Your-www-site)/rbjun14/test6.txt # If the correct details are entered above, # the rest of the script should work for most people. ### Create a local text file to upload via FTP line_t = format("***** %s *****", Time.now) line_b = '*' << '=' * (line_t.length-2) << '*' File.open(TEMP_FILENAME, 'w') do |tmp| tmp.puts(line_b, line_t, line_b) end require 'net/ftp' ftp = Net::FTP.open(MY_WEBSPACE_FTP, USER, PASSWORD, ACCOUNT) begin retries = 1 begin ftp.chdir(FTP_DIR_NAME) rescue Net::FTPPermError => err puts "Last response = #{ftp.lastresp}" puts err if ftp.lastresp == '550' # No such directory retries -= 1 unless retries < 0 ### Create test directory ### puts "Creating #{FTP_DIR_NAME} directory" ftp.mkdir(FTP_DIR_NAME) ### retry end end raise 'Directory unavailable' end puts "Uploading file #{TEMP_FILENAME}" ftp.puttextfile(TEMP_FILENAME, TEMP_FILENAME) file_list = ftp.nlst('*') puts '-' * 80 puts file_list ## ftp.delete(TEMP_FILENAME) ## ftp.chdir('..') # parent dir ## ftp.rmdir(FTP_DIR_NAME) ensure ftp.close ## Close Connection File.delete(TEMP_FILENAME) # local (temp) text file end #<--end--> #-> Last response = 550 #-> 550 No such directory. #-> Creating rbjun14 directory #-> Uploading file test6.txt #-> -------------------------------------------------------------------------------- #-> test6.txt daz