Rubyにはファイルを操作するライブラリがあり、これを利用することで不要なファイルを削除するプログラムを作れます。そしてファイル削除に使えるライブラリとしてよく利用されるのがFileUtilsモジュールです。
今回はFileUtilsモジュールのrmメソッドを利用した、ファイルを削除するプログラムの作り方を紹介します。
Rubyでファイルを削除するには
ファイルの作成、変更、削除は、LinuxをはじめとするOSの基本機能です。そして、このOSの機能を利用するためのコマンドが用意されています。しかしこの機能はプログラムからでも利用可能です。
プログラミング言語RubyにもOSの機能を利用できることから、ファイルを削除するプログラムを作成できます。さらにRubyでファイルを削除する処理を作る方法は1つではありません。まずはRubyでファイルを削除する複数の手順について紹介します。
rmコマンドを実行する
CentOSやUbuntuなどのLinuxではファイルを削除するrmコマンドを使えます。そしてRubyには外部コマンドを実行する機能があるので、このrmコマンドを使ってファイルを削除することが可能です。
この場合、rmコマンドでファイルを削除するコマンドの文字列を用意し、これを実行します。なおRubyにはコマンドを実行する方法が複数用意されているので、単純に削除するだけなら簡単に作れるでしょう。ただし、エラーが発生することもあるので、実行結果をチェックするなどの例外処理が必要です。
IOクラスのメソッドを利用する
Rubyにおけるファイルを操作するライブラリがFileクラスです。そしてFileクラスには、ファイルを削除するためのdeleteメソッドが用意されており、これを使うことでファイルを削除できます。
Fileクラスのdeleteメソッドの使い方
File.delete( ファイルのパス )
ただし、このメソッドはファイル専用であり、ディレクトリの削除はできません。ディレクトリを削除するには、Dirクラスのrmdirメソッドを利用します。また、ファイル削除の際にエラーが発生した場合、Rubyはその時点で処理を中断します。そのためエラーが発生した場合を考慮してbegin~rescueによる例外処理も必要です。
FileUtilsモジュールを使う
Rubyでは、削除などのファイルへの操作をFileクラスのメソッドで行う他に、より便利に使えるFileUtilsモジュールも利用できます。ただし、このFileUtilsモジュールはRubyの標準ライブラリのため、Rubyをインストールすれば利用できますが、requireで読み込む必要があるので注意してください。
なお、FileUtilsモジュールのファイル削除の代表的なメソッドがrmですが、これを使うことでファイルだけでなくディレクトリの削除も可能です。もしファイルのみまたはディレクトリのみを削除する場合は、FileUtilsモジュールの他のメソッドの利用も検討してください。
FileUtilsモジュールの使い方は次に詳しく紹介します。
FileUtilsモジュールによるファイル削除
先ほど、Rubyでファイル削除のプログラムを書くなら、FileUtilsモジュールのrmメソッドが使えると紹介しましたが、FileUtilsモジュールにあるファイル削除のメソッドはそれだけではありません。目的に応じたメソッドが利用できます。
次からFileUtilsモジュールによるファイル削除に使えるメソッドを紹介します。
FileUtilsモジュールの削除用メソッド
FileUtilsモジュールで利用できるファイルおよびディレクトリ削除用のメソッドは次のとおりです。
rm, remove
リストで指定された対象を削除する。オプションを指定可能。
remove_dir
指定したパスのディレクトリを削除する。
remove_entry
指定したファイルを削除し、もしディレクトリなら再帰的に削除する。
remove_entry_secure
効果はremove_entryと同じで、セキュリティに配慮した削除処理を実現する。
remove_file
指定したファイルを削除する。
rm_f
rmメソッドで「:force => true」オプションを指定した場合と同じ。
rm_r
ファイルまたはディレクトリ list を再帰的に消去する。
rm_rf
ファイルまたはディレクトリ list を再帰的に消去し、rm_rに「:force => true」オプションを指定した場合と同じ。
rmdir
ディレクトリを削除する。ただしディレクトリにファイルが残っていた場合は削除に失敗する。
rmメソッドの文法
先ほど紹介したようにFileUtilsモジュールには削除用メソッドが幾つもありますが、よく使われるのはrmメソッドです。まずはrmメソッドの使い方をマスターしましょう。
rmメソッドは、1つまたは複数のファイルを指定することで、そのファイルを削除します。なお、削除するファイルが1つなら文字列で、複数のファイルを指定する場合は配列で指定します。さらに、強制的に削除するなどのオプションを指定することが可能です。
rmメソッドの文法
FileUtils.rm( 削除対象ファイル名 )
または
FileUtils.rm( 削除対象ファイル名, オプション )
rmメソッドの使用例
次にFileUtilsモジュールのrmメソッドの使用例を紹介します。
require 'fileutils' fname = "tmp.txt" begin FileUtils.rm(fname) puts "#{fname}を削除しました" rescue puts "#{fname}を削除できません" end
これはtmp.txtというファイルを削除する例ですが、最初に「require ‘fileutils’」でFileUtilsモジュールを読み込み、rmメソッドを実行しています。そして、rmメソッドは、begin~rescue構文に記述することで、エラーが発生してもそこでプログラムが中断しないように対策しています。
rmメソッドのオプション
先ほど紹介したRubyでファイル削除のプログラム作成に使われるrmメソッドでは、「:force」「:noop」「:verbose」の3つオプションを利用できます。これらのオプションの使い方について紹介します。
rmメソッドのオプション
rmメソッドのオプションは次の3つです。
:noop
trueを指定すると実際にはファイルを削除しない。
:verbose
trueを指定すると詳細を出力する。
:force
trueを指定するとエラーを無視する。なおこのエラーとは、begin~rescue構文の例外処理でキャッチできるエラーです。
オプションを指定した例
次に、:noopオプションを指定したrmメソッドの例を紹介します。
require 'fileutils' fname = "tmp.txt" rm_mode = true begin FileUtils.rm(fname, :noop => rm_mode ) puts "#{fname}を削除しました" rescue puts "#{fname}を削除できません" end
上の例は、先ほど紹介した例に、「:noop => rm_mode」を追加し、「rm_mode = true」により、rmメソッドのオプションの:noopにtrueを指定することで、実際にはファイルを削除しないでプログラムを実行しています。そして、この例では、「rm_mode = false」と書き直すことでファイル削除を実行します。
:forceオプションに注意
先ほどrmメソッドで:forceオプションを使うとエラーを無視できると紹介しましたが、このオプションはrmコマンドの-fオプションとは違います。Rubyをエラーで止めないだけで、消せないファイルを強制的に削除する機能ではありません。
rmメソッドのエラーを無視するのではなく、エラーが発生した場合は例外処理で適切に処理するプログラムを作成してください。
まとめ
これまで紹介したようにFileUtilsモジュールのrmメソッドを利用することで、Rubyのプログラムの中でファイルを削除する処理を作れます。そしてrmメソッドではオプションを使えば、実際にファイルを削除しない、といったテスト実行も可能です。
さらにFileUtilsモジュールには他にもファイルやディレクトリを削除するメソッドがあるので、必要に応じて利用してください。