处理目录更改中的错误

时间:2019-06-13 20:07:09

标签: c

我正在尝试在程序中实现目录更改的功能,并且我想使用errno.h处理错误。

int main(void)
{
    char directory[100];
    scanf("%[^\n]", directory);


    switch(chdir(directory))
        {
            case 0:
                printf("\nSuccess\n");
                break;

            case EACCES:
                perror("\nError ");
                break;

            case EIO:
                perror("\nError ");
                break;

            case ENAMETOOLONG:
                perror("\nError ");
                break;

            case ENOTDIR:
                perror("\nError ");
                break;

            case ENOENT: 
                perror("\nError ");
                break;
        }

    return 0;
}

它编译没有错误,并且我能够更改目录,因此case 0可以正常工作。但是当出现错误时,我无法使其他情况起作用。

chdir的手册页上,据说在发生错误时,将返回-1并正确设置了errno。我在Linux和Windows 7上都进行了测试。

1 个答案:

答案 0 :(得分:4)

我认为您遇到的问题是返回值和errno之间的区别。 errno是全局变量,在errno.h中声明。您想要的是这样的:

#include <stdio.h>
#include <errno.h>

int main(void)
{
    char directory[100];
    scanf("%[^\n]", directory);

    if (chdir(directory) != 0) {
        switch (errno) {
          case EACCES:
            perror("\nError ");
            break;
          /*  ... */
        }
    }
}

您的交换机中有很多情况下确实做同样的事情,这也有些奇怪……我认为那是因为它们只是存根,并且您确实想在代码中以不同的方式处理不同的错误,但是如果没有,您可以放下开关并做类似的事情

if (chdir(directory) != 0) {
    perror("\nError ");
    exit(EXIT_FAILURE);
}