添付しているファイルを移動しても安全ですか?

添付しているファイルを移動しても安全ですか?

fs.appendFileに行を追加するnode.jsプロセスがあります。たとえば、2つの呼び出しの代わりにfile.logそれぞれ約40文字の行全体を追加します。このファイルを次の場所に移動すると、行が失われたり部分的にコピーされないようにできますか?fs.appendFile("start-end")fs.appendFile("start-")fs.appendFile("end")file2.log

ベストアンサー1

ファイルシステムの境界を越えてファイルを移動しない限り、操作は安全です。これは、「移動」が実際に行われる方法であるダイナミクスによるものです。

ファイルが同じファイルシステムにある場合、mvファイルは実際に触れることなくファイルシステムエントリのみが変更されます。

$ mv foo bar

実際には、次のことを行います。

$ ln foo bar
$ rm foo

これにより硬いファイル(実際にはファイルシステムエントリが指すinode)へのリンク(2番目のディレクトリエントリ)のfoo名前が指定され、barエントリfooが削除されます。これで、削除時にinodeをfoo指す2番目のファイルシステムエントリがあるので、古いエントリを削除してもfoo実際fooにそのinodeに属するブロックは削除されません。

開かれたファイルハンドルがファイルシステムエントリではなくファイルのinodeを指すので、プログラムはとにかくファイルに幸せに追加されます。

メモ:プログラムが書き込みの間にファイルを閉じて再度開くと、次のエラーが発生します。新しい以前のファイルシステムエントリを使用してファイルが作成されました!

ファイルシステム間の移動:

ファイルシステムの境界を越えてファイルを移動すると、状況が悪くなる可能性があります。この場合、mv実際にはファイルの一貫性は保証されません。

  • ターゲットファイルシステムに新しいファイルを作成します。
  • 古いファイルの内容を新しいファイルにコピーします。
  • 古いファイルの削除

または

$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo

それぞれ。

$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo

アプリケーションへの書き込み中にコピーがファイルの終わりに達したかどうかに応じて、新しいファイルには行が半分しかありません。

また、アプリケーションが古いファイルを閉じて再度開くことができない場合は、古いファイルが削除されたように見えても、古いファイルに書き込まれます。カーネルはどのファイルが開いているかを知っており、ファイルシステムエントリを削除しても削除されます。それ。古いファイルの inode と関連ブロックは、アプリケーションが開いたファイルハンドルを閉じるまで削除されません。

おすすめ記事