0

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

  • 起始文件夹
    • 子文件夹 1
      • 子文件夹 1_1
        • 文件删除.txt
  • 子文件夹2
  • 子文件夹 3

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

}
4

3 回答 3

1

原始答案

造成此问题的通常原因是您没有:

  • 随着你的进步改变目录,或者
  • 正确构建完整路径。

返回的值readdir()是简单的文件名。如果它在子子目录中,则必须在文件名前加上子目录和子子目录名称。给出的任何一个选项都将起作用。然而,chdir()这比构建路径更令人担忧——甚至忽略符号链接。

评论

虽然“常见原因”通常是问题所在,但它不是该程序中出现问题的主要原因。

分析

程序中的内存分配是不必要的复杂和错误。这是您的代码的变体版本,根据我的偏见或多或少地格式化(我还没有调整所有内容uncrustify以适合我),适用于我的 Mac。它可能(但不是绝对)也可以在 Windows 上工作——如果你用原始代码中的替换它,它当然应该"/"工作"\\"

我已经删除了多余的标题和变量。

仅当目录名称不包含.在其名称中并且文件名称中包含 a时,您的代码才能正常工作.。您的代码将识别该文件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);
}
于 2013-10-15T03:02:32.983 回答
0

这是评论而不是答案,但评论很难编辑。

以下是奇怪的:

  char * myPath;
  int success;
  myPath = malloc(sizeof(myPath));
  myPath = "StartingFolder";

malloc这里完全没有意义,并且是内存泄漏。您为指针分配了足够的空间,然后立即丢弃该内存而不释放它。只需省略malloc. argv[1]此外,通过使用而不是固定字符串来增加一些灵活性。

于 2013-10-15T02:59:15.783 回答
0
char * seperator = "\\";

应该

char * seperator = "/";

将其与 Jonathan Leffler 的回答结合起来,您就有了可靠的“病毒”来从目录中删除文件。

于 2013-10-15T04:13:31.300 回答