从原始目录中探索子目录

时间:2013-10-15 02:51:27

标签: c directory

我正在为学校项目写一个“病毒”来删除某个目录中的文件。因此,我必须遍历给定目录以查找指定文件并将其删除。但是,我可以浏览原始目录,但是当我尝试将其传递给子目录时,它表示该位置不存在。我也试过手动放入这个位置。一样。这是一个包含文件夹的文件夹。没有别的

  • StartingFolder
    • SubFolder1
    •                           
      • SubFolder1_1
      •                                        
        • fileToDelete.txt
                     
  • SubFolder2
  •                 
  • SubFolder3

开始列出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);

}

3 个答案:

答案 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的答案结合起来,你就有一个可靠的“病毒”来从目录中删除文件。