2

現在のディレクトリにあるすべての JPG ファイルをリストするこのコードを書きました。

#include <string.h>
#include <stdio.h>
#include <dirent.h> 
int main() {
    char *ptrToSubString;
    char fileName[100];
    DIR *dir;
    struct dirent *ent;
    dir = opendir(".");
    if (dir != NULL) {
            while((ent = readdir(dir)) != NULL) {
                   strcpy(fileName,ent->d_name);
                   ptrToSubString = strstr(fileName,".jpg");
                   if (ptrToSubString != NULL) {
                       printf("%s",ent->d_name);
                   } else {
                      continue;
                   }
            }
            closedir(dir);
    } else {
            perror("");
            return 5;
 }
return 0;
}

しかし、ファイルの名前を一意のファイル名に変更するか、一意の識別子をファイル名に追加する機能を追加したいと思います。

たとえば、プログラムが次のファイル名をリストする場合:

  • facebook.png
  • instagram.png
  • ツイッター.png

に改名してもらいたい

  • facebook-a0b1c2.png
  • instagram-d3e4f5.png
  • twitter-a6b7c9.png

これを達成する方法について何か考えはありますか?どんな助けでも大歓迎です!ありがとうございました!

4

2 に答える 2

3

名前を分割します。

*(ptrToSubString++) = 0x0;

次に、ランダムな16進シーケンス(またはカウンター?)を追加して名前を再結合します。

snprintf(newFilename, SIZE_OF_NEWFILENAME_BUFFER,
     "%s-%06x.%s", fileName, rndhex, ptrToSubString);

rename()新しいファイルを呼び出します。

アップデート

Zack が気づいたように、新しいファイルが存在する場合、名前の変更は失敗しないため、生成後newFilename(stat競合状態に注意してください。Zack の他のコメントを参照してください)、またはopen(newFilename, O_WRONLY|O_CREAT|O_EXCL, 0600)新しい名前が使用されていないことを確認するために使用する必要があります。そうであれば、新しい乱数を生成して繰り返します。

于 2012-09-28T23:31:41.673 に答える
1

で見つかったrename機能がありstdio.hます。次のように使用できます。

/* rename example */
#include <stdio.h>

int main (){
    int result;
    char oldname[] ="oldname.txt";
    char newname[] ="newname.txt";
    result= rename( oldname , newname );
    if ( result == 0 )
        puts ( "File successfully renamed" );
    else
        perror( "Error renaming file" );
    return 0;
}

これをニーズに合わせてください。詳細については、こちらをご覧ください。

于 2012-09-28T23:32:41.773 に答える