スキップしてメイン コンテンツに移動

Fileクラスのファイル名は上書きできない

プログラムを整理しようと思い、rename候補のファイル名がすでに存在してたら、ファイ名の末尾の数字(つまり分)に1を足して別のファイル名にしてrenameするということをやりました。
ファイルが存在するかしないかをwhileの条件式にいれ、ファイルが存在する場合はFileの名前を上書きしようとしましたが、Javaではそれが許されていない。ファイルクラスのオブジェクトは一旦作成すると変更不可の様子。
困ったので
while((new File(folderpath + filename+".wmv")).exists()){
のように作成したファイルクラスのオブジェクト名を特に指定せずに用いるという技で乗り切りました。
また同様にStringクラスも上書きができないのでStringBufferクラスを使用。
あとFileクラスのrenameToメッソッドを使ってファイル名を置き換えてもファイルクラスのgetName()でファイル名を取得しても置き換わらないことがわかりました。(これはなんでか理解できていないが、Javaの試験問題にもでるほど常識な様子)

あれやこれやでようやく整理ができました。
次回はリストのファイルを読み込んで一括変換させるようにします。

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package filerename;
import java.io.File;
import java.util.Calendar;
/**
*
* @author nao
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//setup initial variable
String folderpath = new String("C:\\Documents and Settings\\nao\\デスクトップ\\test\\");
String inputString = new String("2004/04/251631 2009_01_19_22_34_10.wmv");
//インプットのStringを整形
// "/"を削除
String afterReplace1 = inputString.replaceAll("/", "");
// 空白を削除
String afterReplace = afterReplace1.replaceAll(" ", "");
System.out.println("after replace string:"+afterReplace);
//最初から4文字目を抜き出す(年数部分)
String Syear = new String( afterReplace.substring( 0, 4 ) );
//5,6文字目を抜き出す(月部分)
String Smonth = new String( afterReplace.substring( 4, 6 ) );
//7,8文字目を抜き出す(日数部分)
String Sday = new String( afterReplace.substring( 6, 8 ) );
//9,10を抜き出す(時間部分)
String Shour = new String( afterReplace.substring( 8, 10 ) );
//11,12を抜き出す(分部分)
String Smin = new String( afterReplace.substring( 10, 12 ) );
//残りを抜き出す(元ファイル名)
String orgname = new String( afterReplace.substring( 12, 35 ) );
System.out.println("Year:"+Syear);
System.out.println("Month:"+Smonth);
System.out.println("Day:"+Sday);
System.out.println("Hour:"+Shour);
System.out.println("Min:"+Smin);
//StringをInegerへ変換
int year = Integer.parseInt(Syear);
int month = Integer.parseInt(Smonth);
int day = Integer.parseInt(Sday);
int hour = Integer.parseInt(Shour);
int min = Integer.parseInt(Smin) ;
System.out.println("元ファイル名:"+orgname);
//変更前ファイル名
File orgFile = new File(folderpath + orgname);
boolean orgfileext = orgFile.exists();
System.out.println(orgFile + (orgfileext? " is found " : " is missing "));
//変更後のファイル名
StringBuffer filename = new StringBuffer(Syear+"_"+Smonth+"_"+Sday+"_"+Shour+"_"+Smin);
//変更後のファイル名がすでにないか確認して変更
System.out.println("Rename candidate is "+filename+".wmv");
while((new File(folderpath + filename+".wmv")).exists()){
System.out.println(folderpath + filename +" exists");
min = min + 1;
filename.replace(14,16, String.valueOf(min) );
}
File newFile = new File(folderpath + filename+".wmv");
if(orgfileext){
System.out.println("Start Rename to "+newFile.getName()+" from "+orgFile.getName());
boolean rename = orgFile.renameTo(newFile);
if(rename){
//ファイル名変更成功
System.out.println("Rename Successful");
//日付を設定 (月は設定したい月-1が必要)
Calendar newcalendar = Calendar.getInstance();
newcalendar.set(year, month-1, day, hour, min, 00);
System.out.println(newcalendar.getTime());
//更新日付を変更
boolean lastTime=newFile.setLastModified(newcalendar.getTimeInMillis());
System.out.println("Last Modified: "+lastTime);
System.out.println(newFile.lastModified());
}
else{
//ファイル名変更失敗
System.out.println("Fail to rename");
}
}
else{
boolean rename = false;
System.out.println(orgFile +" not exists.");
}
}
}

コメント

このブログの人気の投稿

川上村の中井渓谷自然塾

ここからしばらくはライフログとして更新が滞っていた夏以降のイベントについて 海の日に川に行ってきました。 大和郡山市からは約1時間半で到着できる川上村の中井渓谷自然塾。 メインはアマゴのつかみ取り。そしてBBQ。1日6000円で楽しめます。 川にもつかって、なぜかおたまじゃくしをとったりと大満足。 帰りはあきのの湯の温泉で汗を流して帰りました。 川上村、いいとこです。 中井渓谷自然塾の場所 こんな場所 BBQできるとこ。屋根付き BBQの下の川で、あまごの釣りもできる (ただ放流されてもあまり釣れない感じ) つかみどりのあまご。幼稚園児でも意外とつかめる 帰りによった、あきのの湯

Pinarello X1 ホワイトを購入

 友達としまなみ海道やTANTAN LONGライドに行ったりしているけど、あとからロードバイク始めた友達の方が圧倒的に早く一緒に走れないので、今回機材ドーピングを実施。 前々から30万円程度でエントリーのカーボン&105に乗れたらなーと思っていたが、昨今の円安により価格上昇。 で1年ほど前にはPinarelloのParisのブルーがめちゃくちゃいいんじゃない?と思って購入直前まで進んだが、子供が私立大学に行くことになって一旦断念。 ただ、今は横浜に単身赴任中なので、今のOrebaを横浜に持っていってトレーニング用に使い、関西帰ってきたときはロングライドに行く、という願望が本格化。 Parisの後継がX1とかX3になって、なんだかなー、XシリーズよりParisの名前の方がかっこいいなーと思っていた。 ( https://www.riogrande.co.jp/pinarello_opera/pinarello2022-2023/x1.php へのリンク) 買うならCerveloのCaredoniaがCervelo の割にお手頃で、これを買おう!と思っていたが、105Di2もいいなーとか思っていたら、Soloistのエアロフレームかっこいいから105の機械式でもいいから、これ買おーとか思ったり。そして色はSky blueがいいんだけど、そんなの最近出てこないから(ブラック強し)、ホワイトで黒ロゴだとかっこいいなーと思っていた。 で、Orbeaでお世話になっているお店のサイトみたり、最近はY's roadのサイトを見て最新情報をチェックしてたら、以下のX1購入記事を発見。 https://ameblo.jp/guell-bicycle/entry-12829804724.html これはホイールがグレードアップ してるからちょっと違うけどX1の白めちゃかっこいいやんー! しかも、よくよく考えたらXって俺みたいなやつのためにある自転車。でピナレロはなんだかんだいって、日本でもしっかり自転車供給している。 まあでも様子見と思ってたら以下の謎キャンペーン始まる。 https://ameblo.jp/guell-bicycle/entry-12830828372.html 実はコロナで急増した自転車ブームも一段落し、メーカーでは在庫が出ちゃっているらしいので、需要喚起のた

初アピタ

アピタには毎週のように行っていますが、今日は初めて長男と二人で自転車で行ってきました。 黄砂と風の吹く中でしたが、無事買い物してこれました 写真はたまたま見たアピタ内でのフルートの演奏会です 可愛く、若かったので思わず見てしまいました。。。