Class: File

Inherits:
Object
  • Object
show all
Defined in:
lib/ftools.rb

Overview

ftools.rb: Extra tools for the File class

Author

WATANABE, Hirofumi

Documentation

Zachary Landau

This library can be distributed under the terms of the Ruby license. You can freely distribute/modify this library.

It is included in the Ruby standard library.

Description

ftools adds several (class, not instance) methods to the File class, for copying, moving, deleting, installing, and comparing files, as well as creating a directory path. See the File class for details.

FileUtils contains all or nearly all the same functionality and more, and is a recommended option over ftools

When you

require 'ftools'

then the File class aquires some utility methods for copying, moving, and deleting files, and more.

See the method descriptions below, and consider using FileUtils as it is more comprehensive.

Constant Summary collapse

BUFSIZE =
8 * 1024

Class Method Summary collapse

Class Method Details

.catname(from, to) ⇒ Object

If to is a valid directory, from will be appended to to, adding and escaping backslashes as necessary. Otherwise, to will be returned. Useful for appending from to to only if the filename was not specified in to.



44
45
46
47
48
49
50
# File 'lib/ftools.rb', line 44

def catname(from, to)
  if directory? to
    join to.sub(%r([/\\]$), ''), basename(from)
  else
    to
  end
end

.chmod(mode, *files) ⇒ Object Also known as: o_chmod

Changes permission bits on files to the bit pattern represented by mode. If the last parameter isn't a String, verbose mode will be enabled.

File.chmod 0755, 'somecommand'
File.chmod 0644, 'my.rb', 'your.rb', true


237
238
239
240
241
# File 'lib/ftools.rb', line 237

def chmod(mode, *files)
  verbose = if files[-1].is_a? String then false else files.pop end
  $stderr.printf "chmod %04o %s\n", mode, files.join(" ") if verbose
  o_chmod mode, *files
end

.compare(from, to, verbose = false) ⇒ Object Also known as: cmp

Returns true if and only if the contents of files from and to are identical. If verbose is true, from <=> to is printed.



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/ftools.rb', line 130

def compare(from, to, verbose = false)
  $stderr.print from, " <=> ", to, "\n" if verbose

  return false if stat(from).size != stat(to).size

  from = open(from, "rb")
  to = open(to, "rb")

  ret = false
  fr = tr = ''

  begin
    while fr == tr
	fr = from.read(BUFSIZE)
	if fr
 tr = to.read(fr.size)
	else
 ret = to.read(BUFSIZE)
 ret = !ret || ret.length == 0
 break
	end
    end
  rescue
    ret = false
  ensure
    to.close
    from.close
  end
  ret
end

.copy(from, to, verbose = false) ⇒ Object Also known as: cp

Copies a file from to to using #syscopy. If to is a directory, copies from to to/from. If verbose is true, from -> to is printed.



87
88
89
90
# File 'lib/ftools.rb', line 87

def copy(from, to, verbose = false)
  $stderr.print from, " -> ", catname(from, to), "\n" if verbose
  syscopy from, to
end

.install(from, to, mode = nil, verbose = false) ⇒ Object

If src is not the same as dest, copies it and changes the permission mode to mode. If dest is a directory, destination is dest/src. If mode is not set, default is used. If verbose is set to true, the name of each file copied will be printed.



250
251
252
253
254
255
256
257
# File 'lib/ftools.rb', line 250

def install(from, to, mode = nil, verbose = false)
  to = catname(from, to)
  unless exist? to and cmp from, to
    safe_unlink to if exist? to
    cp from, to, verbose
    chmod mode, to, verbose if mode
  end
end

.makedirs(*dirs) ⇒ Object Also known as: mkpath

Creates a directory and all its parent directories. For example,

File.makedirs '/usr/lib/ruby'

causes the following directories to be made, if they do not exist.

  • /usr

  • /usr/lib

  • /usr/lib/ruby

You can pass several directories, each as a parameter. If the last parameter isn't a String, verbose mode will be enabled.



205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/ftools.rb', line 205

def makedirs(*dirs)
  verbose = if dirs[-1].is_a? String then false else dirs.pop end
  mode = 0755
  for dir in dirs
    parent = dirname(dir)
    next if parent == dir or directory? dir
    makedirs parent unless directory? parent
    $stderr.print "mkdir ", dir, "\n" if verbose
    if basename(dir) != ""
      begin
        Dir.mkdir dir, mode
      rescue SystemCallError
        raise unless directory? dir
      end
    end
  end
end

.move(from, to, verbose = false) ⇒ Object Also known as: mv

Moves a file from to to using #syscopy. If to is a directory, copies from from to to/from. If verbose is true, from -> to is printed.



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/ftools.rb', line 99

def move(from, to, verbose = false)
  to = catname(from, to)
  $stderr.print from, " -> ", to, "\n" if verbose

  if RUBY_PLATFORM =~ /djgpp|(cyg|ms|bcc)win|mingw/ and file? to
    unlink to
  end
  fstat = stat(from)
  begin
    rename from, to
  rescue
    begin
      symlink readlink(from), to and unlink from
    rescue
	from_stat = stat(from)
	syscopy from, to and unlink from
	utime(from_stat.atime, from_stat.mtime, to)
	begin
 chown(fstat.uid, fstat.gid, to)
	rescue
	end
    end
  end
end

Removes a list of files. Each parameter should be the name of the file to delete. If the last parameter isn't a String, verbose mode will be enabled. Returns the number of files deleted.



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/ftools.rb', line 168

def safe_unlink(*files)
  verbose = if files[-1].is_a? String then false else files.pop end
  files.each do |file|
    begin
      unlink file
      $stderr.print "removing ", file, "\n" if verbose
    rescue Errno::EACCES # for Windows
      continue if symlink? file
      begin
        mode = stat(file).mode
        o_chmod mode | 0200, file
        unlink file
        $stderr.print "removing ", file, "\n" if verbose
      rescue
        o_chmod mode, file rescue nil
      end
    rescue
    end
  end
end

.syscopy(from, to) ⇒ Object

Copies a file from to to. If to is a directory, copies from to to/from.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/ftools.rb', line 56

def syscopy(from, to)
  to = catname(from, to)

  fmode = stat(from).mode
  tpath = to
  not_exist = !exist?(tpath)

  from = open(from, "rb")
  to = open(to, "wb")

  begin
    while true
	to.syswrite from.sysread(BUFSIZE)
    end
  rescue EOFError
    ret = true
  rescue
    ret = false
  ensure
    to.close
    from.close
  end
  chmod(fmode, tpath) if not_exist
  ret
end