- PR -

native2asciiでのファイル上書きができない場合

1
投稿者投稿内容
DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 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>
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2003-02-17 12:26
2つの仮定に基づいてお話をさせていただきます。

1. Strutsを使ったアプリケーションの場合
2. OSがLinux他のUNIX系の場合

1の場合、アプリケーションサーバを上げたままの状態で
native2asciiしようとしていないでしょうか?
Strutsだとアプリケーションサーバを起動する際設定ファイルの情報を読み込んで、
その時握ったファイルのロックを離さないまま動くので
アプリケーションサーバを上げたままでは消去もできなかったりします。
その場合は先にアプリケーションサーバを落とせばいいでしょう。

OSがUNIX系の場合は、ファイルの権限を確認してみてください。
生成先のファイルに書き込み権限は付いているでしょうか?

参考までに、私はXMLでこう記述しています。

コード:
<native2ascii src="../struts" 
              includes="*.properties" 
              dest="${tomcat.home}/${app.name}/WEB-INF/classes"/>

DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 2003-02-17 16:08
引用:

ayumさんの書き込み (2003-02-17 12:26) より:
2つの仮定に基づいてお話をさせていただきます。

1. Strutsを使ったアプリケーションの場合
2. OSがLinux他のUNIX系の場合




ご回答ありがとうございます。
残念ながらWindows2000です。
普通のアプリケーション用の設定ファイルなので、ほかのプログラムがロックしているとも思えません。
何か初歩的な見落としをしているんでしょうか……
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-02-17 16:36
こんにちは、さくらばです。

引用:

DaikiRyutoさんの書き込み (2003-02-17 16:08) より:

残念ながらWindows2000です。
普通のアプリケーション用の設定ファイルなので、ほかのプログラムがロックしているとも思えません。
何か初歩的な見落としをしているんでしょうか……




たぶん、見落としてます
例えば、コマンドプロンプトで a.txt が存在するときに、
b.txt を a.txt にリネームしたとすると

コード:
C:\>ren b.txt a.txt
重複するファイル名が存在するか、またはファイルが
見つかりませんでした。

C:\>



となって、 リネームできません。
これと同じことが Java でも起こっているのです。Java の
File#renameTo は Windows 2000 だと Win23API の
_wrename を呼び出しますが、これはコマンドの ren と
同じ動作になります。結局、ファイルが存在すればリネームは
できません。


Ant をお使いなのですから、<delete> タグを使用して、
native2ascii を行う前にファイルを消去すればいいと思います。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-02-17 16:43
話が飛びすぎていますね。補足です。

native2ascii は内部でテンポラリファイルを作成して
そこにまず変換結果を書き込みます。その後、変換が終
わると、テンポラリファイルを指定された出力ファイル
にリネームします。

このため、前の投稿のようなリネームの問題が出てくる
のです。

言葉足らずですいませんでした。

引用:

さくらばさんの書き込み (2003-02-17 16:36) より:

例えば、コマンドプロンプトで a.txt が存在するときに、
b.txt を a.txt にリネームしたとすると

<!-- BBCode Start --><TABLE BORDER="0" ALIGN="CENTER" WIDTH="90%" CELLSPACING="0" CELLPADDING="0"><TR><TD WIDTH="5%" NOWRAP><FONT SIZE="-1">コード:</font></td><TD WIDTH="95%"><HR SIZE="1" WIDTH="100%"></td></tr><TR><TD COLSPAN="2"><PRE>C:>ren b.txt a.txt
重複するファイル名が存在するか、またはファイルが
見つかりませんでした。

C:></pre><HR SIZE="1" WIDTH="100%"></td></tr></table><!-- BBCode End -->

となって、 リネームできません。


小野
会議室デビュー日: 2003/02/17
投稿数: 1
投稿日時: 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
投稿数: 55
投稿日時: 2003-02-17 20:48
J2SE 1.4.1をお使いですね?
J2SEのバグです。

この前バグパレード見たときは、1.4.2で直すよって書いてあったように記憶しています。私はとりあえず変換先を予め削除することで対処しています。
DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)