Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyで一時ファイルを作成する方法

一時ファイルを作成すると、OS内にランダムな名前の空のファイルが作成されます。 (オペレーティングシステム)一時フォルダ。

このファイルは自動的に削除されます 。

Rubyでこれをどのように行うことができますか?

このように

require 'tempfile'

Tempfile.create { |f| f << "abc\n" }

ここでf あなたのファイルです&<< 書き込みます。

これはRubyに組み込まれているため、gemをインストールする必要はありません。

わかりました。

簡単ですが、まだ質問があるかもしれません。

いいね

  • ファイルはいつ正確に削除されますか?
  • 一時ファイルから読み戻せないのはなぜですか?
  • 一時ファイルは一意であることが保証されていますか?

これらの質問とその他のいくつかの質問に答えて、理解を深めることができます!

新規作成と作成の違いは何ですか?

Tempfile ファイルを作成する方法は2つあります。

1つはnew 、もう1つはcreate

違いは何ですか?

ドキュメントによると、new Tempfileを作成します オブジェクト(予想どおり)ですが、create Fileを提供します オブジェクト。

Tempfileなので、それはそれほど重要ではないと思います。 Fileに委任します 。

本当の違いは、create ブロックを受け入れます。

しかし、new しません。

これを試してください

Tempfile.new {}

この役立つ警告が表示されます

# warning: Tempfile.new doesn't call the given block.

createでブロックを使用できます ブロックの終了後に一時ファイルが確実に削除されるようにします。

これにより、次の質問が発生します…

TempFileはいつ削除されますか?

通常のファイルのように自分でファイルを削除することで、ファイルをいつ削除するかを制御できます(delete メソッド)、またはcreateを使用する ブロック付き。

自動削除は次の場合に機能します

  • プログラムは終了します
  • ファイルは「ガベージコレクション」されます。つまり、ファイルはアルゴリズムによってメモリから削除され、スペースが解放されます。

後者は、ファイルへの参照を保持していない場合にのみ発生する可能性があります。

変数のように。

これが私の言いたいことです

t = Tempfile.new

tの場合 スコープ外になると、一時ファイルを削除できます。

Linuxを使用している場合、どのファイルが作成および削除されているかをリアルタイムで監視するための非常に興味深いツールはinotify-toolsです。

このコマンドを試してください

inotifywait /tmp -m --format "%w %e %f %T" --timefmt "%H:%m:%S"

次に、ファイルを作成するRubyコードを実行します。

ruby -rtempfile -e "def c; t = Tempfile.new('testing'); end; c; sleep 10"

これが表示されます

/tmp/ CREATE testing20190506-11391-1wqcng0 14:51:48
/tmp/ OPEN testing20190506-11391-1wqcng0 14:51:48
/tmp/ CLOSE_WRITE,CLOSE testing20190506-11391-1wqcng0 14:51:58
/tmp/ DELETE testing20190506-11391-1wqcng0 14:51:58

一時ファイルから読み戻せないのはなぜですか?

一時ファイルの1つから読み戻そうとすると、空の文字列が表示されます。

Tempfile.create { |f| f << "abc\n"; f.read }
# ""

なぜですか?

Fileであることが判明しました IOです オブジェクト。

IOオブジェクトには位置ポインタがあります &ファイルに書き込むと、この位置が進みます。

したがって、読みたい場合は、このポインタを巻き戻す必要があります。

このように

Tempfile.create { |f| f << "abc\n"; f.rewind; f.read }
# "abc\n"

ファイルの内容をフラッシュする必要がある場合もあります。

temp = Tempfile.new

temp << "1"
temp << "2"

temp.flush

Tempfileは本当にユニークですか?

Tempfileは一意のファイル名を作成し、権限モードを600に設定します。これは、このファイルを作成したユーザーのみがファイルを読み取ることができることを意味します。

しかし、名前が重複することはありますか?

ドキュメントにはこれが記載されています

「Tempfileのファイル名ピッキング方法は、スレッドセーフとプロセス間セーフの両方です。他のスレッドやプロセスが同じファイル名を選択しないことを保証します。」

そして、newの説明 また、一意のファイル名が見つからない場合はエラーが発生する可能性があるとも述べています。

ファイルにプレフィックスを設定できることも知っておくとよいでしょう。

このように

Tempfile.new("banana-").path
# "/tmp/banana-20190426-25403-1cm7sjt"

これにより、名前の衝突の可能性が減少します。

バイナリモードで一時ファイルを開く

画像、音楽、またはプレーンテキスト以外のものを使用している場合は、ファイルモードをバイナリに設定することをお勧めします。

バイナリファイルモードは、行末変換を停止します。

その結果、データはより「生」になり、バイナリファイルの一部を壊さないようになります。

バイナリモードはデフォルトでは有効になっていません

temp = Tempfile.new

temp.binmode?
# false

このように有効にできます

temp = Tempfile.new
temp.binmode

temp.binmode?
# true

これはcreateでも機能します 方法:

Tempfile.create do |f|
  f.binmode

  f << "bacon\n"
end

概要

Tempfileを使用してRubyの一時ファイルについて学習しました クラス!

今度はあなたが練習する番です。

読んでくれてありがとう🙂


  1. Windows 10で一時ファイルを削除する方法

    Windows で一時ファイルを削除する方法10: PC やデスクトップは、複数のファイルが保存されるストレージ デバイスとしても機能することはご存知のとおりです。多くのアプリケーションやプログラムもインストールされています。これらのファイル、アプリ、その他のデータはすべてハードディスクのスペースを占有し、ハードディスクのメモリが容量いっぱいになる原因となります。 ハードディスクにそれほど多くのファイルやアプリが保存されていなくても、ハードディスクのメモリがほぼいっぱいになっている場合があります。次に、新しいファイルやアプリを保存できるように空き容量を確保するために、重要なデータであっても削

  2. Windows 11 で PDF ファイルを作成する方法

    Windows の最も顕著な機能の 1 つは、ドキュメントを PDF に印刷する機能です。 PDF がほぼすべての印刷ニーズに対応するフォーマットになっていることを考えると、これは非常に便利なツールです。 PDF 形式が提供する堅牢性と自由度は、専門家でさえ PDF 形式を好む主な理由です。 Microsoft は XPS を PDF の有力な競争相手として開発することに投資し、Windows の組み込み機能として Print to Microsoft XPS をリリースしました。しかし残念なことに、XPS が普及することはありませんでした。そして最終的に、Microsoft はその乗り物を