2009-04-30 6 views
12

誰かがLinuxサーバー上のフォルダに10MbのサイズのファイルをFTPで送信しています。 ファイルが移行している間に、cronが起動し、ftpフォルダを見てそこで見つかったものを別のフォルダに移動するように設計されたPerlスクリプトが起動します。私はFile::Copymove()関数を使用しています。 Perlプロセスは実際にはタスクの一部としてファイルの名前を変更します。それは重要ですか、FTPはファイルシステムがファイルを何と記述しているか気にしませんか?Perlがアップロード中のファイルに対してmove()を呼び出そうとしたらどうなりますか?

move()が成功し、部分的なファイルを移動し、FTPを何かするようにしますか? または、失敗して0を返しますか?

+0

私の質問を投票してくれてありがとう! :) –

+3

Windows IMHOとは対照的に、Linuxの最大の特長の1つは、移動、名前変更、削除などのファイルを開くことができ、それらを開いているアプリケーションは気づかないということです。実行中にプログラムを削除することもできますが、プログラムは正常に実行されますが、終了すると戻ってくることはありません... – rmeador

+0

move()とは何ですか?おそらくファイルの名前を変更するのではなく、ファイルをコピーするのでしょうか。 –

答えて

10

いいえ、移動するだけで新しい位置でダウンロードプロセスを完了させる必要があります。 inodeをある位置から別の位置に移動するだけです。ダウンロードプログラムの開いているファイルディスクリプタはまだそれを指していなければなりません。

私はちょっとだけ言及したことを繰り返したいと思います。これは、移動操作が同じファイルシステム上にある限り、動作します。 inodeとは別のファイルシステムとして、同じファイルシステムに属しているので転送できません。最も可能性の高いシナリオは、その時点での部分データが新しい場所にコピーされる一方で、プログラムはもはやファイルに添付されていない古いiノードにダウンロードされ、そのため使用できないということです。

+1

これらの名前を変更するのは、inodeを変更しないからです。ファイルシステムでは、名前はinodeに関連付けられています。あなたの質問に関しては、移動と名前の変更はほぼ同じです。古いファイル名を持つ新しいファイルには別のinodeだけが含まれ、問題はありません。この場合、次の質問になります:) –

+2

注意:ファイルシステムを移動すると、アップロードは終了しますが、inodeへの参照が存在しないためファイルにアクセスできなくなります。あなたは他のファイルシステム上の部分的なファイルで終わるでしょう。 –

1

私はよく分かりませんが、間違いはないでしょう。移動はファイルのiノード番号を変更しないので、FTPサーバは移動をまったく気付かず、新しい場所のファイルへの書き込みを続けます。まもなく、move()が成功し、新しい場所でアップロードが続行されます。

5

標準moveが存在しないため、あなたのシナリオで何が起こっているのかを知ることは難しいです。 renameを意味するならば、あなたの状況が間違っている主な方法は、あるファイルシステムから別のファイルシステムにファイルを移動していて(したがってコピーと削除をして、実際の移動)、ほとんどのシステムでrenameはこのような状況で失敗します。 (セットアップがまったく機能しても問題ありません)

renameしかし、moveの機能を使用していない場合、たとえば、ファイルシステム間での移動を処理する場合、非常にうまくいく可能性があります複数のファイルシステムが含まれている場合は部分的なファイルです。 (これは、例えば、あなたが今は一つのファイルシステム上にいるなら、あなたがアップロードしているこれらのファイルの上にたくさんのスペースをとり、それらを保存する専用のドライブを追加すれば、今はクロスファイルシステムの動きをしています。)

+0

私はperl move関数を使用していますが、これは単なるラッパーです> mv -src -dest 特にコードはmove( "$ ftpDir $ inFile"、 "$ someOtherDir $ newFileName")です。 –

+2

システム/ bin/mvのラッパーであれば、ファイルシステムが(現在または将来)*移動する場合にのみ、部分的なファイル*が危険にさらされます。 – chaos

+0

しかし、ファイルシステムが同じであれば、害はないと同意していますか? –

関連する問題