- - PR -
native2asciiでのファイル上書きができない場合
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-02-16 18:16
native2asciiでResourceBundle用のファイルを生成するときに、困っています。
すでに生成したファイルがある場合、ファイルの上書きができずにエラーとなってしまいます。 直接コマンドラインから入力してもAntを使用しても同じです。 更新後に毎回ファイルを消すのも面倒なので、何かヒントでもいただければ…。 Antで使用しているXMLはこんな感じです。 <?xml version="1.0" encoding="Windows-31J"?> <project name="propertiesbuilder" default="properties" basedir="."> <!-- propertiesファイル作成 --> <target name="properties"> <native2ascii src="." dest="." includes="*.sjis" ext=".properties" /> </target> </project> | ||||||||
|
投稿日時: 2003-02-17 12:26
2つの仮定に基づいてお話をさせていただきます。
1. Strutsを使ったアプリケーションの場合 2. OSがLinux他のUNIX系の場合 1の場合、アプリケーションサーバを上げたままの状態で native2asciiしようとしていないでしょうか? Strutsだとアプリケーションサーバを起動する際設定ファイルの情報を読み込んで、 その時握ったファイルのロックを離さないまま動くので アプリケーションサーバを上げたままでは消去もできなかったりします。 その場合は先にアプリケーションサーバを落とせばいいでしょう。 OSがUNIX系の場合は、ファイルの権限を確認してみてください。 生成先のファイルに書き込み権限は付いているでしょうか? 参考までに、私はXMLでこう記述しています。
| ||||||||
|
投稿日時: 2003-02-17 16:08
ご回答ありがとうございます。 残念ながらWindows2000です。 普通のアプリケーション用の設定ファイルなので、ほかのプログラムがロックしているとも思えません。 何か初歩的な見落としをしているんでしょうか…… | ||||||||
|
投稿日時: 2003-02-17 16:36
こんにちは、さくらばです。
たぶん、見落としてます 例えば、コマンドプロンプトで a.txt が存在するときに、 b.txt を a.txt にリネームしたとすると
となって、 リネームできません。 これと同じことが Java でも起こっているのです。Java の File#renameTo は Windows 2000 だと Win23API の _wrename を呼び出しますが、これはコマンドの ren と 同じ動作になります。結局、ファイルが存在すればリネームは できません。 Ant をお使いなのですから、<delete> タグを使用して、 native2ascii を行う前にファイルを消去すればいいと思います。 | ||||||||
|
投稿日時: 2003-02-17 16:43
話が飛びすぎていますね。補足です。
native2ascii は内部でテンポラリファイルを作成して そこにまず変換結果を書き込みます。その後、変換が終 わると、テンポラリファイルを指定された出力ファイル にリネームします。 このため、前の投稿のようなリネームの問題が出てくる のです。 言葉足らずですいませんでした。
| ||||||||
|
投稿日時: 2003-02-17 20:37
はじめまして、小野と申します。
>すでに生成したファイルがある場合、ファイルの上書きができずにエラーとなってしまい >ます。 私もこの現象にかなり泣かされたのですが、この現象が起こるようになったのは JDK 1.4 からですよね。 さくらばさんのおっしゃている通りまずファイルを削除してしまえばよいのですが、すでに JDK 1.3 で native2ascii を使っているビルドファイルをたくさん作っていて泣かされた 人は非常に多いのではないかと思います。 そんな人向けに、この現象を強引に回避する方法があります。 (1) jdk1.3 の sun.tools.native2ascii.Main のみを格納した jar ファイルをつくる (例えば oldnative2ascii.jar) (2) 上記 jar ファイルを jre/lib/endorsed に入れる この方法で一応回避はできます。 ただ、endorsed による rt.jar 内のクラスの差し替えは JAXP の実装の置換等に限られて いるため、非常に強引、というか本当はやってはいけないことになっています。 ですので、あまりお勧めはできません。 ant でなくコマンドラインからの実行でよければ、 native2asccii in.xml > out.xml でももちろん ok です。 [ メッセージ編集済み 編集者: おの 編集日時 2003-02-17 20:43 ] | ||||||||
|
投稿日時: 2003-02-17 20:48
J2SE 1.4.1をお使いですね?
J2SEのバグです。 この前バグパレード見たときは、1.4.2で直すよって書いてあったように記憶しています。私はとりあえず変換先を予め削除することで対処しています。 | ||||||||
|
投稿日時: 2003-02-19 17:50
ありがとうございました。
とりあえず変換する前に全削除することで対応します。 ちなみにAntを使う前までは、Cygwinでこんなことやってました。 #!/bin/bash rm *.properties for moto in $( ls -1 *.sjis ) ; do saki=$(echo $moto | sed 's/sjis/properties/g') native2ascii $moto $saki done | ||||||||
1
