- PR -

ファイルのコピーと移動処理

投稿者投稿内容
がちゃぴん
会議室デビュー日: 2002/02/06
投稿数: 19
お住まい・勤務地: 東京都・いろいろ
投稿日時: 2004-09-13 12:05
ファイルのコピーと移動処理をjava.io.Fileクラス等を使用して、
読む→別ファイルに書くでコピー、書いた後に読み込みファイルを削除することによって
移動処理としていましたが、移動処理は、FileクラスのrenameToメソッドを使用しても
できるので、読み込み書き込みのコードを記述しなくて済むので、以下のようなコードで
実装するようになりました。

java.io.File file = new java.io.File( "c:\\abc.txt" ); // 移動元
java.io.File file2 = new java.io.File( "c:\\tmp\\abc.txt" ); // 移動先
boolean ret = file.renameTo( file2 );


そこで、コピー処理も同様にできないものかと相当の動作をするメソッドを探しましたが
見当たりませんでした。コピー処理に相当するメソッドは無いから、コピーする場合は
読む→別ファイルに書くという方法しかないのでしょうか?
また、皆さんがコピーと移動処理を実装する際は、どのように行われていますでしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-09-13 12:16
unibon です。こんにちわ。

引用:

がちゃぴんさんの書き込み (2004-09-13 12:05) より:
そこで、コピー処理も同様にできないものかと相当の動作をするメソッドを探しましたが
見当たりませんでした。コピー処理に相当するメソッドは無いから、コピーする場合は
読む→別ファイルに書くという方法しかないのでしょうか?
また、皆さんがコピーと移動処理を実装する際は、どのように行われていますでしょうか?


renameTo はファイルシステムの機能を使って、文字通り「リネーム」しているため、ファイルシステム上でリネームに該当しない操作になる場合は失敗します。
たとえば、C: にあるファイルを A: に「リネーム」しようとしてもできません。
また、コピーに特化した API はなかったはずです。地道にファイルを読んでそれを別のファイルに書くコードを10〜20行ほどで書くしかないでしょう(なんらかのフレームワークにはこのようなメソッドが備わっているかもしれませんが)。
したがって、どんな環境でも動くようにするためには、renameTo は使えないでしょう。ただ、「リネーム」はコピーを伴わないため、速いですから、とりあえず renameTo を試みて、エラーだったらコピーするコードを実行する、という2段構えは良いかもしれません。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-09-13 13:00
引用:

unibonさんの書き込み (2004-09-13 12:16) より:
renameTo はファイルシステムの機能を使って、文字通り「リネーム」しているため、ファイルシステム上でリネームに該当しない操作になる場合は失敗します。
たとえば、C: にあるファイルを A: に「リネーム」しようとしてもできません。



できます。
少なくとも、Win2000 + JDK1.4.2では、D: から C: に「renameTo」できました。
内部的には、unibonさんのいうような手順が実装されているのだろうと思いますが。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-09-13 13:15
Fileクラスにコピーメソッドあっても良い気が
しますけどないですねぇ。

私は仕方ないんで、自作のUtilityクラスに
コピーメソッド実装して使ってます。

標準でコピーメソッド実装してほしいかも。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2004-09-13 13:50
Jakarta Commons IOにそういうユーティリティクラスがあります。
http://jakarta.apache.org/commons/io/apidocs/org/apache/commons/io/FileUtils.html#copyFile(java.io.File, java.io.File)
http://jakarta.apache.org/commons/io/
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-09-13 13:55
unibon です。こんにちわ。

引用:

coasmさんの書き込み (2004-09-13 13:00) より:
少なくとも、Win2000 + JDK1.4.2では、D: から C: に「renameTo」できました。
内部的には、unibonさんのいうような手順が実装されているのだろうと思いますが。


すみません。昔調べたのですが、忘れてしまいました。
Windows ではできるけど、Linux だとだめだったかも(これもあいまい)。
あいつー
ベテラン
会議室デビュー日: 2004/05/20
投稿数: 89
投稿日時: 2004-09-13 14:53
あいつーです。
unibonさん援護(笑

引用:

引用:

coasmさんの書き込み (2004-09-13 13:00) より:
少なくとも、Win2000 + JDK1.4.2では、D: から C: に「renameTo」できました。
内部的には、unibonさんのいうような手順が実装されているのだろうと思いますが。


すみません。昔調べたのですが、忘れてしまいました。
Windows ではできるけど、Linux だとだめだったかも(これもあいまい)。


Solarisだと別スライス上へのrenameは失敗します。
がちゃぴん
会議室デビュー日: 2002/02/06
投稿数: 19
お住まい・勤務地: 東京都・いろいろ
投稿日時: 2004-09-13 15:51
皆さん、回答ありがとうございます。
java.io.File 等の標準APIには、やはり、コピー処理を行うようなメソッドは
無いんですねー。また、renameTo も使用するならば、OSによることを前提で
使用しなければならないと...。

読み書きを自前のコードで作っていましたが、読み書きしなければならないならば、
koeさんが言われたような、Jakarta Commons IO 等のAPIを使用した方が
安全なのかもしれないですね。

皆さんのおかげでいろいろよくわかりました。ありがとうございます。

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