c - 是否可以使用目录流重命名 C 中的文件?
问题描述
我是 C 新手。我编写了这个程序,允许我批量重命名同一目录中的文件(主要是显示)。它目前正在使用来自 stdio 的 Rename 函数,同时使用 dirent 结构来查找“旧名称”。但是,这意味着必须将“新名称”和“旧名称”添加到“路径字符串”中,以便 Rename 可以找到文件。我希望有一种方法可以直接使用 dirent 更改文件名。
我尝试将 dp->d_name 更改为“新名称”,但这并没有更改文件名。
这不是我的完整工作程序,而是我用来尝试测试其他重命名方法的代码。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int main(){
DIR *dirp;
struct dirent *dp;
char dir[500];
char pathOne[500] = "Testing.txt";
int i;
printf("\nPlease enter the target directory :\n");
scanf("%[^\n]s",dir);
dirp = opendir(dir);
printf(dirp ? "Directory Connection Successful\n\n" : "Directory Connection Failed\n\n");
printf("%s\n", pathOne);
while(dp = readdir(dirp)){
if((dp->d_name[0])!='.'){
for(i = 0; dp->d_name[i] = pathOne[i]; i++);
printf("%s\n", dp->d_name);
}
}
return 0;
}
Please enter the target directory :
H:\Documents\TestFolder
Directory Connection Successful
Testing.txt
Testing.txt
Testing.txt
Testing.txt
Press any key to continue . . .
这是我在控制台中得到的,但资源管理器中的文件名没有改变。
解决方案
struct dirent
是用来表示你将要阅读的程序中的目录结构readdir
,修改其中的内容,不会影响目录的实际结构。
这structure
意味着在目录中保存特定文件的某些信息,因此它与实际文件没有链接。
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; not supported
by all filesystem types */
char d_name[256]; /* Null-terminated filename */
};
您可以使用rename
系统调用来重命名实际的file
.
例子:
while(dp = readdir(dirp)){
if((dp->d_name[0])!='.'){
char oldPath[1024], newPath[1024];
sprintf(oldPath, "%s/%s",dir, dp->d_name);
sprintf(newPath, "%s/%s",dir, pathOne);
if (rename(oldPath, newPath) < 0)
printf("rename error path=%s", oldPath);
}
}
推荐阅读
- jquery - 出现错误: THEAD 中的列数无效或不正确;预期 1465,但找到 1000 列
- jestjs - 用于修复“Jest 遇到意外令牌”以进行导入/导出的 Jest 配置
- java - 如何将基于 Spring Boot 2.0.4 构建的项目从 mysql5 迁移到 mysql8?
- php - Directus 无法安装在共享主机上
- python - 如何找到神经网络的误报率和误报率?
- bash - 如何使用 ansible playbook 将变量放入 bash 脚本中
- php - PHPSpreadSheet Writer Xlx 在 PHP 7.0 版中不起作用
- javascript - Lodash _.flatMapDepth 返回深层嵌套的对象数组
- terraform - Terraform 与 CLI 上的 openstack 联合用户
- python - 有人可以解释这段代码中实际参数和形式参数背后的原因吗