我正在为学校项目写一个“病毒”来删除某个目录中的文件。因此,我必须遍历给定目录以查找指定文件并将其删除。但是,我可以浏览原始目录,但是当我尝试将其传递给子目录时,它表示该位置不存在。我也试过手动放入这个位置。一样。这是一个包含文件夹的文件夹。没有别的
开始列出SubFolder1,SubFolder2和SubFolder3。我将原始位置与新文件夹连接起来,并递归传递新位置。我没有这样的文件或目录。
StartingFolder是与正在运行的程序位于同一目录的文件夹。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <assert.h>
int checkFolder(char * myPath)
{
DIR *d;
struct dirent *dir;
int success = 0;
printf("Path: %s\n", myPath);
if ((d = opendir(myPath)) != NULL)
{
while ((dir = readdir(d)) != NULL)
{
char * seperator = "\\";
char * pathFound = dir->d_name;
char * tempPath = "";
tempPath = malloc(sizeof(tempPath));
strcpy(tempPath, myPath);
strcat(tempPath, seperator);
strcat(tempPath, pathFound);
//printf("Files in Path: %s\n",tempPath);
if(strstr(tempPath, ".txt"))
{
success = 1;
}
else if(!strchr(tempPath, '.'))
{
checkFolder(tempPath);
}
}
closedir(d);
}
else
{
perror("opendir() error");
}
return success;
}
int main(void)
{
char * myPath;
int success;
myPath = malloc(sizeof(myPath));
myPath = "StartingFolder";
success = checkFolder(myPath);
printf("%d\n",success);
return(0);
}
答案 0 :(得分:1)
这种麻烦的常见原因是你没有:
readdir()
返回的值是简单文件名。如果它位于子子目录中,则必须在文件名前加上子目录和子子目录名称。给出的任何一个选项都可以。然而,chdir()
比构建路径更令人担忧 - 甚至忽略了符号链接。
虽然“常见原因”通常是麻烦,但这不是导致此计划出现问题的主要原因。
程序中的内存分配不必要地复杂,并且也是错误的。这是您的代码的变体版本,根据我的偏见或多或少地格式化(我还没有调整uncrustify
中的所有内容以适合我),这在我的Mac上有效。它可能(但不是最终确定)也可以在Windows上运行 - 如果你用原始代码中的"/"
替换"\\"
,它肯定会起作用。
我删除了多余的标题和变量。
当目录名在名称中不包含.
且文件名中包含.
时,您的代码才能正常运行。您的代码将识别文件horrid.txt-or-binary
,因为它包含字符串.txt
。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
static int checkFolder(char *myPath)
{
DIR *d;
struct dirent *dir;
int success = 0;
printf("Path: %s\n", myPath);
if ((d = opendir(myPath)) != NULL)
{
while ((dir = readdir(d)) != NULL)
{
char *separator = "/";
char *pathFound = dir->d_name;
char tempPath[1024];
strcpy(tempPath, myPath);
strcat(tempPath, separator);
strcat(tempPath, pathFound);
printf("Files in Path: %s\n", tempPath);
if (strstr(tempPath, ".txt"))
{
success = 1;
printf("Found: %s\n", tempPath);
}
else if (strchr(tempPath, '.') == 0)
{
checkFolder(tempPath);
}
}
closedir(d);
}
else
{
perror("opendir() error");
}
return success;
}
int main(void)
{
char myPath[] = "StartingFolder";
int success = checkFolder(myPath);
printf("%d\n", success);
return(0);
}
答案 1 :(得分:0)
这是评论而不是答案,但评论很难编辑。
以下是奇怪的:
char * myPath;
int success;
myPath = malloc(sizeof(myPath));
myPath = "StartingFolder";
malloc
在这里完全没有意义,并且是内存泄漏。您为指针分配了足够的空间,然后您立即丢弃该内存而不释放它。只需省略malloc
即可。此外,使用argv[1]
而不是固定字符串来增加一些灵活性。
答案 2 :(得分:0)
char * seperator = "\\";
应该是
char * seperator = "/";
将其与Jonathan Leffler的答案结合起来,你就有一个可靠的“病毒”来从目录中删除文件。