ファイルを移動して上書きする操作を探しています。Java7に新しいメソッドがあることは知っていますが、 Java7を回避したいと考えていました。また、 FileUtilsとGuavaのメソッドについても知っていますが、 FileUtils は上書きされず、Guava はそれを文書化していません。
また、私は自分自身のメソッドを書くことができることを認識していますが、始めましたが、あちこちでいくつかの問題が見られたので、すでに何かが行われていることを望んでいました.
何か提案はありますか?
ファイルを移動して上書きする操作を探しています。Java7に新しいメソッドがあることは知っていますが、 Java7を回避したいと考えていました。また、 FileUtilsとGuavaのメソッドについても知っていますが、 FileUtils は上書きされず、Guava はそれを文書化していません。
また、私は自分自身のメソッドを書くことができることを認識していますが、始めましたが、あちこちでいくつかの問題が見られたので、すでに何かが行われていることを望んでいました.
何か提案はありますか?
私は次の方法を使用します:
public static void rename(String oldFileName, String newFileName) {
new File(newFileName).delete();
File oldFile = new File(oldFileName);
oldFile.renameTo(new File(newFileName));
}
FileUtils.copyFileToDirectory の Apache FileUtils JavaDoc は、「宛先ファイルが存在する場合、このメソッドはそれを上書きします」と述べています。コピー後、削除する前に確認できます。
public boolean moveFile(File origfile, File destfile)
{
boolean fileMoved = false;
try{
FileUtils.copyFileToDirectory(origfile,new File(destfile.getParent()),true);
File newfile = new File(destfile.getParent() + File.separator + origfile.getName());
if(newfile.exists() && FileUtils.contentEqualsIgnoreCaseEOL(origfile,newfile,"UTF-8"))
{
origfile.delete();
fileMoved = true;
}
else
{
System.out.println("File fail to move successfully!");
}
}catch(Exception e){System.out.println(e);}
return fileMoved;
}
私は独自のメソッドの作成を終了しました。可能な解決策に関心のあるすべての人のために、ApacheCommons FileUtils を使用しました。これもおそらく完璧ではありませんが、私にとっては十分に機能します。
/**
* Will move the source File to the destination File.
* The Method will backup the dest File, copy source to
* dest, and then will delete the source and the backup.
*
* @param source
* File to be moved
* @param dest
* File to be overwritten (does not matter if
* non existent)
* @throws IOException
*/
public static void moveAndOverwrite(File source, File dest) throws IOException {
// Backup the src
File backup = CSVUtils.getNonExistingTempFile(dest);
FileUtils.copyFile(dest, backup);
FileUtils.copyFile(source, dest);
if (!source.delete()) {
throw new IOException("Failed to delete " + source.getName());
}
if (!backup.delete()) {
throw new IOException("Failed to delete " + backup.getName());
}
}
/**
* Recursive Method to generate a FileName in the same
* Folder as the {@code inputFile}, that is not existing
* and ends with {@code _temp}.
*
* @param inputFile
* The FileBase to generate a Tempfile
* @return A non existing File
*/
public static File getNonExistingTempFile(File inputFile) {
File tempFile = new File(inputFile.getParentFile(), inputFile.getName() + "_temp");
if (tempFile.exists()) {
return CSVUtils.getNonExistingTempFile(tempFile);
} else {
return tempFile;
}
}
オーバーライド メソッドを使用した純粋な Java nio ソリューションの移動は、示されているように事前削除ターゲットを使用して実装できます。
public void move(File sourceFile, String targetFileName) {
Path sourcePath = sourceFile.toPath();
Path targetPath = Paths.get(targetFileName);
File file = targetFile.toFile();
if(file.isFile()){
Files.delete(targetPath);
}
Files.move(sourcePath, targetPath);
}
Apache Commons FileUtils の使用:
try {
FileUtils.moveFile(source, dest);
print("------------------------------");
print(name
+ " moved to "
+ PropertiesUtil
.getProperty(PropertiesUtil.COMPLETED_PATH));
} catch (FileExistsException fe){
if(dest.delete()){
try {
FileUtils.moveFile(source, dest);
} catch (IOException e) {
logger.error(e);
}
print("------------------------------");
print(name
+ " moved to "
+ PropertiesUtil
.getProperty(PropertiesUtil.COMPLETED_PATH));
}
} catch (Exception e) {
logger.error(e);
}
独自のユーティリティを作成する場合は、上書きをサポートする Antでのタスクの実装を検討することをお勧めします。copy