はじめまして。過去の同様な質問があるかもしれませんが、その時はご容赦ください。
1000を超えるMP3ファイルが、file_mp3 というフォルダに入っています。
dirを使って、そのファイル名をすべて取得して構造体KOZOにいれます。
KOZOのメンバーはファイル名(fname)と通し番号(index)だけです。
typedef struct{
int index;/*ファイルの通し番号*/
char fname[200]; /*ファイルの名前*/
} KOZO;
すべてのファイル名をKOZOに取得し、indexは乱数にて重複しない通し番号を設定できました。
(ファイルをシャッフルしたいのです)。
さて、ここからが問題で、dirを使いfile_mp3フォルダを検索し、KOZO.fname と一致しているものを捜し
KOZO.index "_" を接頭語にして元のファイル名を変更し、別のフォルダ(new_mp3)に移動させたいのですが
以下のコードでは、1つのファイルしか移動できません。(つまり、rename関数が正常終了するのが、file_mp3の先頭にある1個のファイルだけで
残りのファイルは正常終了できません。)
if((dir=opendir(file_mp3))!=NULL){
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
for(i=0;i<fcount;i++){ /* KOZOは全部で fcount ある */
if(strstr(dp->d_name,file.fname)!=NULL){ /* file_mp3 内ファイルとKOZO.fnameが部分一致しているものをさがす */
for(j=0;j<sizeof(cbuf)/sizeof(char);j++) cbuf[j]='\0';
sprintf(cbuf,"%d_%s",file.index,file.fname); /* index_を接頭語にして新しいファイル名(cbuf)をつくる */
if(rename(strcat(file_mp3,dp->d_name),strcat(new_mp3,cbuf))==0){
printf("%s コピー完了\n",cbuf);
break; /*for(i=0;i<fcount;i++) を抜ける*/
}
}
}
}
closedir(dir);
} /* if((dir=opendir(file_mp3))!=NULL) */
else{"指定したフォルダが開けません3\n";exit(1);}
dirで検索中に、検索対象のフォルダ内のファイルに何らかの操作を加えることができないのかとも思いましたが、1個はできているので
そのあたりも不明です。
よろしくご教授ください。
C言語 dirを使ってファイルを求め、その名前を変更する
Re: C言語 dirを使ってファイルを求め、その名前を変更する
- ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
- 質問中のC言語のソースコードと推測される文字列に未定義の識別子が多く、一見意味がよくわかりません。コンパイルして不都合を再現できる最低限のコードがあると親切でしょう。
- strcatによって変更されたfile_mp3およびnew_mp3の内容が戻されていないため、2回目以降のrenameの引数が意図しないものになっている可能性があります。
- 全角のfを含むfile_mp3という識別子は、一部のコンパイラでしか使えません。特に宗教上の理由、コーディング規約、こだわりなどの理由がないのであれば、半角に統一することをおすすめします。
- "指定したフォルダが開けません3\n"; という何もしない文があるのが気になります。これは本来文字列の出力を意図したのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 dirを使ってファイルを求め、その名前を変更する
投稿者です。
掲示板のルールをよく理解しないまま投稿してしまい、コードが大変見苦しく表示されてしまいました。
申し訳ございません。
また、コード内の変数等にも記述間違いなどがあり、とても人様にご意見をうかがうことのできる内容ではありませんでした。
初心者のたわごととご容赦いただきまして、無視してくだいませ。
お目汚し失礼いたしました。
掲示板のルールをよく理解しないまま投稿してしまい、コードが大変見苦しく表示されてしまいました。
申し訳ございません。
また、コード内の変数等にも記述間違いなどがあり、とても人様にご意見をうかがうことのできる内容ではありませんでした。
初心者のたわごととご容赦いただきまして、無視してくだいませ。
お目汚し失礼いたしました。