私のPHPには奇妙な問題があります。 rename()でファイルを移動しようとするたびに、ファイルが移動されるだけでなく、コピーするディレクトリもその中のすべてのファイルとともに削除されます。元のコードは次のとおりです。PHPでのrename()の奇妙な動作
rename('temp.odt', 'tmp/report.odt');
が、私はすでに無駄に
rename('temp.odt', 'tmp\report.odt');
rename('temp.odt', 'tmp\\report.odt');
rename('temp.odt', 'tmp' . DIRECTORY_SEPARATOR . 'report.odt');
rename('C:\wamp\www\zaiko\temp.odt', 'C:\wamp\www\zaiko\tmp\report.odt');
のすべてのような他のパスの区切り文字を試してみました。このコードは、私が取り組んでいるシステムで使われているサードパーティのモジュールから来ています。よく確認
ポイント:
- ファイル「temp.odt」は現在のディレクトリに存在しません。
- ディレクトリ 'tmp'は存在し、いくつかのファイルがあります。また、それは読み取り専用ではありません。 ()の名前を変更実行した後
- 対象のファイルが既に存在していない(実際のファイル名にはタイムスタンプを持って、私は簡単にするため、ここでそれを削減)
、「temp.odt」ファイルは元に無傷ですフォルダ 'tmp'はが消滅したとその中のすべてのものです。
(!)警告:名前の変更(temp.odt、tmp \ report.odt)[function.rename]:指定されたパス*が見つかりませんでした。 (コード:3)はC:\ WAMP \ WWW \ ZAIKO \モジュール\ mod_deliver.phpライン192
上*ポルトガル
実行中から翻訳:WindowsのXP上のPHP 5.3.5でのApache 2.2.17とNTFS
編集:
ただ、問題の原因を発見しました。アプリケーションが使用するモジュールは圧縮ライブラリを使用することが判明しました。このライブラリは、アプリケーションで使用されているものとまったく同じ名前の一時フォルダを使用します。
何らかのキャッシュを使用する必要があります。これは、エラーが100%表示されなかった理由を説明します。
問題は 'tmp'フォルダの名前を他のものに変更することで解決します。
ありがとう、私の最初の推測とはまったく関係がありませんでしたので、定式化された質問では、まったくそのような愚かなものであなたを気にして、ごめんね。
ファイルを新しい場所にコピーして元のファイルを削除するとどうなりますか? – nickb
モジュールのコードをどこかに投稿できますか? php.netのコメントに関しては、他の人にはこの問題はありません。 Bugtrackerは、 'rename'はWinXP上の既存のファイルを上書きしないと言いますが、あなたが記述したのと同じ問題ではありません。たぶん、どこかに 'tmp'ディレクトリを整理するコードがありますか? –
rename()が呼び出されたときにファイルハンドル(元のファイル用)が解放されていない可能性がありますか?このプロジェクトが実行されているマシンの特性を考えると、それが問題だと思う傾向があります。 –