C中文件存在的问题

时间:2010-04-01 00:16:06

标签: c file cygwin

这是我的代码,用于检查文件是否存在:

#include<stdio.h>
#include<zlib.h>
#include<unistd.h>
#include<string.h>


int main(int argc, char *argv[])
{
   char *path=NULL;
   FILE *file = NULL;
   char *fileSeparator = "/";
   size_t size=100;
   int index ;
   printf("\nArgument count is = %d", argc);

   if (argc <= 1)
   {
      printf("\nUsage: ./output filename1 filename2 ...");
      printf("\n The program will display human readable information about the PNG file provided");
   }
   else if (argc > 1)
   {
      for (index = 1; index < argc;index++)
      {
            path = getcwd(path, size);
            strcat(path, fileSeparator);
            printf("\n File name entered is = %s", argv[index]);
            strcat(path,argv[index]);
            printf("\n The complete path of the file name is = %s", path);
            if (access(path, F_OK) != -1)
            {
                  printf("File does exist");
            }
            else
            {
                  printf("File does not exist");
            }
            path=NULL;
      }
   }
   return 0;
}

运行命令./output test.txt test2.txt 输出是:

$ ./output test.txt test2.txt

Argument count is = 3
 File name entered is = test.txt
 The complete path of the file name is = /home/welcomeuser/test.txt
 File does not exist
 File name entered is = test2.txt
 The complete path of the file name is = /home/welcomeuser/test2.txt
 File does not exist

现在系统中确实存在test.txt:

$ ls
assignment.c  output.exe  output.exe.stackdump  test.txt

然而test.txt显示为不存在的文件。

请帮我理解这里的问题。此外,请随时发布任何建议,以改善代码/避免错误。

此致 darkie

2 个答案:

答案 0 :(得分:2)

仅仅因为对access()的调用失败并不意味着该文件不存在。由于其他原因,呼叫可能会失败。

使用printf("error:%s\n", strerror(errno));打印出错误消息的文本。

此外,您仍然错误地追加了getcwd收到的“路径”,就像您在上一个问题中那样。即使它没有崩溃,它仍然是不正确的,可能会导致你的问题......甚至可能是你现在遇到的问题。

getcwd()为您的路径分配缓冲区,但该缓冲区的大小仅适合路径。你追加到那个缓冲区,走到了尽头。那很糟糕,你做不到。它会引起问题,偶尔也会崩溃。你需要暂停并理解这个getcwd函数如何工作以及如何正确使用它。

答案 1 :(得分:0)

我强烈建议通过malloc()fpathconf()提示,PATH_MAX)分配足够的空间来存储路径。

分配和组装它的非标准方式是asprintf()

请确保在不再需要时释放生成的路径,并检查因用户输入错误而可能失败的每个呼叫。

如果使用malloc(),请始终检查失败(结果为NULL)。

祝你好运:)