Curl Global Community
ファイルのリネーム - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: ファイルのリネーム (/showthread.php?tid=1040)



ファイルのリネーム - umemura - 02-20-2014

あるファイルをリネームしたいと思ったときに、renameプロシージャを利用しますが、
そのファイルがエディタなどで開かれていると、リネームは出来ません。
現在、そのファイルがリネームできるかどうかを事前に確認するには、どんな方法がありますか?

Url.resolve で、取得したローカルファイルの属性(LocalFile.writable?)は
読み取り専用かどうかという情報しかあらわしていないようでした。

with-local-file-lock であれば、ファイルのロックが取得できなければ例外が返却されるのかなと思ったのですが、
うまくいかないようです。




RE: ファイルのリネーム - tdeng - 02-24-2014

普通に例外発生したら、例外処理で対応すべきではないでしょうか?
”事前”は現状できないと思います。



RE: ファイルのリネーム - umemura - 02-24-2014

ご回答ありがとうございます。
やはり出来ないのですね。

リネームの例外ハンドリングではなく、事前に確認したい理由は、
CSVファイルの内容をDBに取り込む処理があり、
取り込みが正常終了したら、取り込みもとのファイル名の最初に「取込済」という文言をつけたい、
という目的のためです。

とりあえず、他プロセスがファイルを開いているなどで、リネームが出来ない状態かどうかは、
append-open を利用できれば確認できそうですが、
よくよく考えてみたところ、厳密にやろうとするなら、かなり面倒なことになりそうです。

①読み込み元のファイルのロックをかける(append-open create?=false で開く)
  →例外がおきたら、「ファイル名が変更できません」というエラーを表示
②リネーム候補となるファイルを作成し、ロックをかける(append-open create?=false で開く)
 (後続処理中に、同名のファイルを作成されないようにするため)
  →例外がおきたら、「ファイル名が変更できません」というエラーを表示
③取り込み処理を行う
  →取り込み処理で例外がおきたら「取り込み処理に失敗しました」というエラーを表示
④読み込み元と、リネーム候補先のストリームを閉じる
⑤リネームする

with-local-file-lock ファイルのロックが出来ればもう少し楽になりそうなのですが、
このAPIは、別プロセスからファイルを開かれないようにするという目的のものではなさそうなので、
append-open を使うしか今のところ方法がなさそうです。