C中目录和子目录中具有特定扩展名的只读文件。
我修改了这段代码,但问题是,我不能让它只向我发送具有特定扩展名的文件。我尝试了很多东西,但每次都没有得到想要的结果。任何帮助都将不胜感激。这是一个非常大的项目的一部分,我被困在这个特定的功能C中目录和子目录中具有特定扩展名的只读文件。,c,C,我修改了这段代码,但问题是,我不能让它只向我发送具有特定扩展名的文件。我尝试了很多东西,但每次都没有得到想要的结果。任何帮助都将不胜感激。这是一个非常大的项目的一部分,我被困在这个特定的功能 static void list_dir (const char * dir_name) { DIR * d; /* Open the directory specified by "dir_name". */ d = opendir (dir_name); /* Check it wa
static void list_dir (const char * dir_name)
{
DIR * d;
/* Open the directory specified by "dir_name". */
d = opendir (dir_name);
/* Check it was opened. */
if (! d) {
fprintf (stderr, "Cannot open directory '%s': %s\n",
dir_name, strerror (errno));
exit (EXIT_FAILURE);
}
while (1) {
struct dirent * entry;
char * d_name;
/* "Readdir" gets subsequent entries from "d". */
entry = readdir (d);
if (! entry) {
/* There are no more entries in this directory, so break
out of the while loop. */
break;
}
d_name = entry->d_name;
if(!strstr (d_name, ".jpg") == 0 && !strstr (d_name, ".JPG") == 0){
continue;
}
/* Print the name of the file and directory. */
printf ("%s\n", d_name);
/* If you don't want to print the directories, use the
following line: */
//if (! (entry->d_type & DT_DIR)) {
//printf ("%s/%s\n", dir_name, d_name);
//}
if (entry->d_type & DT_DIR) {
/* Check that the directory is not "d" or d's parent. */
if (strcmp (d_name, "..") != 0 && strcmp (d_name, ".") != 0) {
int path_length;
char path[PATH_MAX];
path_length = snprintf (path, PATH_MAX,
"%s/%s", dir_name, d_name);
//printf ("%s\n", path);
if (path_length >= PATH_MAX) {
fprintf (stderr, "Path length has got too long.\n");
exit (EXIT_FAILURE);
}
/* Recursively call "list_dir" with the new path. */
if(!strstr (d_name, ".jpg") == 0 && !strstr(d_name, ".JPG") == 0){
continue;
}
list_dir (path);
}
}
}
/* After going through all the entries, close the directory. */
if (closedir (d)) {
fprintf (stderr, "Could not close '%s': %s\n",
dir_name, strerror (errno));
exit (EXIT_FAILURE);
}
}您应该知道,仅仅使用
.jpg“
和.jpg”
并不能解决区分大小写的问题,因为可能会有更多类似于“.jpg”
的内容
你可以试试这个
int endsWith(const char *const filename, const char *const extension)
{
size_t fileNameLength;
size_t extensionLength;
if ((filename == NULL) || (extension == NULL))
return 0;
fileNameLength = strlen(filename);
extensionLength = strlen(extension);
return (strcasecmp(extension, filename + filenameLength - extensionLength) == 0);
}
那你就可以了
if (endsWidth(d_name, ".jpg") != 0) /* it has jpeg extension */
注意:strcasecmp()
不是标准配置,您可以通过谷歌搜索找到正确的c库替代方案
还有一些库使用所谓的magic字节检查文件类型,它们通常是文件内容中的前4个左右字节,甚至还有一个叫做
libmagic
,尽管我从未使用过,所以我不能给你关于如何使用它的建议。你应该知道,仅仅使用“.jpg”
和“.jpg”
并不能解决区分大小写的问题,因为可能会有更像“.jpg”
等等
你可以试试这个
int endsWith(const char *const filename, const char *const extension)
{
size_t fileNameLength;
size_t extensionLength;
if ((filename == NULL) || (extension == NULL))
return 0;
fileNameLength = strlen(filename);
extensionLength = strlen(extension);
return (strcasecmp(extension, filename + filenameLength - extensionLength) == 0);
}
那你就可以了
if (endsWidth(d_name, ".jpg") != 0) /* it has jpeg extension */
注意:strcasecmp()
不是标准配置,您可以通过谷歌搜索找到正确的c库替代方案
此外,还有一些库使用所谓的magic字节来检查文件类型,它们通常是文件内容中的前4个左右字节,甚至还有一个叫做
libmagic
,尽管我从未使用过它,所以我不能给你关于如何使用它的建议。我将替换该行
if(!strstr (d_name, ".jpg") == 0 && !strstr (d_name, ".JPG") == 0){
使用更具可读性的代码:
if( fileIsNotJPGFile(d_name) ) {
并将其功能实现为:
int fileIsJPGFile(char const* name)
{
return (strstr(name, ".jpg") || strstr(name, ".JPG"));
}
int fileIsNotJPGFile(char const* name)
{
return !(fileIsJPGFile(name));
}
我会更换电话线
if(!strstr (d_name, ".jpg") == 0 && !strstr (d_name, ".JPG") == 0){
使用更具可读性的代码:
if( fileIsNotJPGFile(d_name) ) {
并将其功能实现为:
int fileIsJPGFile(char const* name)
{
return (strstr(name, ".jpg") || strstr(name, ".JPG"));
}
int fileIsNotJPGFile(char const* name)
{
return !(fileIsJPGFile(name));
}
告诉我,什么是
!strstr(d_name,“.jpg”)==0
do?你得到了什么?你期待什么?你为什么期待你得到的?你能把它构建成一个独立的程序并进行测试吗?immibis。这是我运行的原始代码中的一个输入错误。我修好了。该行应该是if((strstr(d_name,.jpg)和&strstr(d_name,.jpg))否;它不应该是if(strstr(d_name,.jpg)和&strstr(d_name,.jpg))
,除非您只想匹配单个文件名,例如MY.jpg.has.jpg
。您需要| |
@immibis解决您的问题;您把搞错了(d_name,“.jpg”)
带strstr(d_name,“.jpg”)==0
.Jonathan;我希望只有扩展名为jpg的文件,但我最终得到了目录和子目录中的所有文件。有一次,我只得到了没有扩展名为jpg的文件,当我更改了逻辑,但没有使用strstr命令时,它没有帮助。告诉我,!strstr(d_name,.jpg)有什么作用==0
do?你得到了什么?你期望什么?你为什么期望得到什么?你能把它构建成一个自包含的程序并测试它吗?immibis。这是我运行的原始代码中的一个输入错误。我修复了它。那一行应该读if((strstrstr(d_name,.jpg)和&strstrstr(d_name,.jpg)),不;它不应该读if(strstr)(d_name,“.jpg”)和&strstr(d_name,“.jpg”)
除非您只想匹配单个文件名,例如MY.jpg.has.jpg
。您需要|
@immibis解决您的问题;您将!strstr(d_name,.jpg”)
与str(d_name,.jpg)混淆了==0
.Jonathan;我只希望文件具有jpg扩展名,但我最终得到了我的目录和子目录中的所有文件。有一次,我只得到了没有jpg扩展名的文件,当我更改了该文件的逻辑,但禁用了strstrstr命令时,它没有任何帮助。另外注意:在Windows上,stracecmp被称为stricmp
.Ad附加说明:在Windows上,stracecmp被称为stricmp
。