> What *should* it do ... ? Dunno. The OS doesn't allow 
> deletion of read only
> files without a switch:
> 
> ... Some sort of switch then would be nice, perhaps. Thoughts?

Here's what I came up with. I have a clutilwin.rb that I started to collect
windows specific routines. It's been fleshed out this afternoon with some
File modifications to handle deletion. The whole file is here:
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/scrapware/scrapwar
e/clutil/ruby/clutilwin.rb?rev=1.2 

Browse here for a unit testing file as well:
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/scrapware/scrapware/clutil/ru
by/

Here's the pertinent guts:

# BSD License
# see
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/scrapware/scrapwar
e/clutil/ruby/clutilwin.rb?rev=1.2 
# for full details

class ClUtilWinErr < Exception
end

class File
  class <<self
    alias o_delete delete
    
    def win_api_delete(filename)
      #
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/file
sio_5n8l.asp
      # BOOL DeleteFile(
      #  LPCTSTR lpFileName   // file name
      # );
      
      # delete file if not read only
      fdelete = Win32API.new("kernel32", "DeleteFile", ["P"], "I")
      fdelete.Call(filename) != 0
    end
    
    def win_file_ro?(filename)
      fFILE_ATTRIBUTE_READONLY = 0x1
      #
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/file
sio_9pgz.asp
      # DWORD GetFileAttributes(
      #   LPCTSTR lpFileName   // name of file or directory
      # );
      fgetattr = Win32API.new("kernel32", "GetFileAttributes", ["P"], "N")
      fattr = fgetattr.Call(filename)
      (fattr & fFILE_ATTRIBUTE_READONLY) != 0
    end
    
    def delete(*files)
      files.each do |file|
        if !win_file_ro?(file)
          win_api_delete(file)
        else
          raise ClUtilWinErr.new(file + ' is read only, cannot delete. Use
File.delete_all')
        end
      end
    end
    
    # I wanted to add a second param to delete, called deleteReadOnly with 
    # a default value of false but (a) I can't have a default value param
    # after the *files param because (b) I can't have any non *param after
    # the *files param. So, my compromise was a separate method
    def delete_all(*files)
      files.each do |file|
        # make writable to allow deletion
        File.chmod(0644, file)
        win_api_delete(file)
      end
    end
  end
end