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
  • 推特-a6b7c9.png

关于如何实现这一目标的任何想法?任何帮助将不胜感激!谢谢!

4

2 回答 2

3

拆分名称:

*(ptrToSubString++) = 0x0;

然后重新组合名称,添加一个随机的十六进制序列(或者可能是一个计数器?)

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 回答