Вопрос о существовании файла в C - PullRequest
3 голосов
/ 01 апреля 2010

Вот мой код, который проверяет, существует ли файл:

#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 отображается как файл, не существующий.

Пожалуйста, помогите мне понять проблему здесь. Также, пожалуйста, не стесняйтесь размещать любые предложения по улучшению кода / избежанию ошибки.

С уважением, Негр

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

Тот факт, что вызов access() не выполнен, не означает, что файл не существует. Вызов может не состояться по другим причинам.

Используйте printf("error:%s\n", strerror(errno));, чтобы распечатать текст сообщения об ошибке.

Также вы по-прежнему неправильно добавляете к «пути», полученному от getcwd, как и в предыдущем вопросе. Даже если это не сбой, это все еще не правильно и может вызвать проблемы ... возможно, даже проблему, которая у вас есть сейчас.

getcwd () выделяет буфер для вашего пути, но размер этого буфера соответствует размеру пути. вы добавляете к этому буферу, проходя мимо конца. Это плохо, ты не можешь этого сделать. Это вызовет проблемы и иногда вылетает. вам нужно сделать паузу и понять, как работает эта функция getcwd и как правильно ее использовать.

0 голосов
/ 01 апреля 2010

Я настоятельно рекомендую выделить достаточно места для хранения пути с помощью malloc () и fpathconf () ( подсказка , PATH_MAX).

Нестандартный способ его выделения и сборки: asprintf () .

Просто обязательно освободите результирующий путь, когда он больше не нужен, и проверяйте каждый вызов, который может быть неудачным из-за опечаток пользователя для сбоя.

Если используется malloc (), всегда проверяйте на наличие ошибки (результат равен NULL).

Удачи с заданием :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...