Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

elsif FileTest::file?(fullname)

FileUtils.copy(fullname, newname)

else

puts "??? : #{fullname}"

end

 end

end

# "Главная программа"

if ARGV.size != 2

 puts "Usage: copytree oldname newname"

 exit

end

oldname = ARGV[0]

newname = ARGV[1]

if ! FileTest::directory?(oldname)

 puts "Ошибка:
первый параметр должен быть именем существующего каталога."

 exit

end

if FileTest::exist? (newname)

 puts "Ошибка: #{newname} уже существует."

 exit

end

oldname = File.expand_path(oldname)

newname = File.expand_path(newname)

$оldname=oldname

$newname=newname

recurse(oldname, newname)

Возможно, и существуют варианты UNIX, в которых команда

cp -R
сохраняет символические ссылки, но нам о них ничего не известно. Программа, показанная в листинге 14.5, была написана для решения этой практической задачи.

14.8.3. Удаление файлов по времени модификации и другим критериям

Предположим, вы хотите удалить самые старые файлы из какого-то каталога. В нем могут, к примеру, храниться временные файлы, протоколы, кэш браузера и т.п.

Ниже представлена небольшая программа, удаляющая файлы, которые в последний раз модифицировались раньше указанного момента (заданного в виде объекта

Time
):

def delete_older(dir, time)

 Dir.chdir(dir) do

Dir.foreach(".") do |entry|

# Каталоги не обрабатываются.

next if File.stat(entry).directory?

# Используем время модификации.

if File.mtime(entry) < time

File.unlink(entry)

end

end

 end

end

delete_older("/tmp",Time.local(2001,3,29,18,38,0))

Неплохо, но можно обобщить. Создадим метод

delete_if
, который принимает блок, возвращающий значение
true
или
false
. И будем удалять те и только те файлы, которые удовлетворяют заданному критерию.

def delete_if(dir)

 Dir.chdir(dir) do

Dir.foreach(".") do |entry|

# Каталоги не обрабатываются.

next if File.stat(entry).directory?

if yield entry

File.unlink(entry)

end

end

 end

end

# Удалить файлы длиннее 3000 байтов.

delete_if("/tmp") { |f| File.size(f) > 3000 }

# Удалить файлы с расширениями LOG и BAK.

delete_if("/tmp") { |f| f =~ /(log|bak)$/i }

14.8.4. Вычисление свободного места на диске

Пусть нужно узнать, сколько байтов свободно на некотором устройстве. В следующем примере это делается по-простому, путем запуска системной утилиты:

def freespace(device=".")

 lines = %x(df -k #{device}).split("\n")

 n = lines.last.split[1].to_i * 1024

end

puts freespace("/tmp") # 16772204544

Эту задачу лучше решать, обернув метод

statfs
в расширение Ruby. Такие попытки в прошлом предпринимались, но, похоже, проект умер.

Для Windows имеется несколько более элегантное решение (предложено Дэниэлем Бергером):

require 'Win32API'

GetDiskFreeSpaceEx = Win32API.new('kernel32', 'GetDiskFreeSpaceEx',

 'PPPP', 'I')

def freespace(dir=".")

 total_bytes = [0].pack('Q')

 total_free = [0].pack('Q')

 GetDiskFreeSpaceEx.call(dir, 0, total_bytes, total_free)

 total_bytes = total_bytes.unpack('Q').first

 total_free = total_free.unpack('Q').first

end

puts freespace("С:") # 5340389376

Этот код должен работать во всех вариантах Windows.

14.9. Различные сценарии

Приведем еще несколько примеров. Не претендуя на оригинальность, мы отнесли их к категории «разное».

Поделиться:
Популярные книги

Поступь Империи

Ланцов Михаил Алексеевич
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Поступь Империи

Герой

Мазин Александр Владимирович
4. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Герой

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

Корабль дураков

Портер Кэтрин Энн
Проза:
современная проза
4.00
рейтинг книги
Корабль дураков

Петля, Кадетский Корпус. Книга четвертая

Алексеев Евгений Артемович
4. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский Корпус. Книга четвертая

Лейтенант. Назад в СССР. Книга 8. Часть 1

Гаусс Максим
8. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лейтенант. Назад в СССР. Книга 8. Часть 1

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 3

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Эфемер

Прокофьев Роман Юрьевич
7. Стеллар
Фантастика:
боевая фантастика
рпг
7.23
рейтинг книги
Эфемер

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Звездная Кровь. Изгой II

Елисеев Алексей Станиславович
2. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой II

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ермак. Регент