如何检查文件是否存在于特定目录中?

时间:2013-07-10 21:44:10

标签: c

我有检查文件存在的功能:

int file_exists(char *filename)
{
    struct stat buffer;
    int i = stat(filename, &buffer);
    if (i == 0) {
        return 1;
    }
    return 0;
}

并且它在完整路径下工作正常,但我想检查用户主目录中是否存在文件,如果不存在 - 在/ etc目录中。怎么做?

4 个答案:

答案 0 :(得分:2)

int 
file_exists(const char *basename)
{
    static const char *dirs[] = { "/etc", "/home/username" };
    char buf[MAX_PATH_LENGTH + 1];
    size_t i;
    struct stat dummy;

    for (i = 0; i < sizeof dirs / sizeof dirs[0]; ++i) {
        (void)snprintf(buf, sizeof buf, "%s/%s", dirs[i], basename);
        if (!stat(buf, &dummy)) return 1; 
    }

    return 0;
}

请注意,如果路径加上文件名长于MAX_PATH_LENGTH个字符,则会失败(即搜索错误的文件)。您可以检查snprintf的返回值以捕获该值。

如果您想避免查找目录/套接字/ ...,可以将if行更改为

if (!stat(buf, &dummy) && S_ISREG(dummy.st_mode)) return 1; 
亚当罗森菲尔德指出。在这种情况下,您可能希望将dummy重命名为更合适的内容(可能是sb)。

答案 1 :(得分:0)

使用errno值,如果文件不存在,则为ENOENT

#include <errno.h>
int file_exists(char *filename)
{
    struct stat buffer;
    int i = stat(filename, &buffer);
    if (i == 0) {
       return 1;
    }
    if (errno == ENOENT)
       printf("%s : file not found\n", buffer);
    return 0;
}

对于您的问题:如果您不想将目录与文件名连接,请使用chdir

答案 2 :(得分:0)

仅将“filename”作为输入,然后使用strcat创建完整路径名 - 如下所示:

int file_exists(char *filename)
{
    struct stat buffer;
    char fullpath[50], *path;
    path = "/home/Nips/"
    if ((strlen(path) + strlen(filename)) >= 50) {
        printf("filename too long!\n");
        return 0;
    }
    strcpy(fullpath, path);
    strcat(fullpath, filename);
    if (stat(fullpath, &buffer) == 0) {
        return 1;
    }
    if (errno == ENOENT) {
        path = "/etc/";
        strcpy(fullpath, path);
        strcat(fullpath, filename);
        if (stat(fullpath, &buffer) == 0) {
            return 1;
        }
        if (errno == ENOENT) {
            printf("File not found!\n");
            return 0;
        }
    }
    printf("Error finding File!\n");
    return 0;
}

注意:代码未经过测试,这只是为了给您一个提示。在实施时进行适当的健全性检查。希望这会给你一些想法!

答案 3 :(得分:0)

始终为您的路径提供完整地址,或在当前目录中提供./。

此外,根据此similar question访问权限(路径名,模式)功能可以满足您的需求。请改用它。成功时返回0,失败时返回-1。 由于access()完全符合您的需要,因此您无需重新实现它。

注意,最常见的模式如下:

  

F_OK,用于检查文件是否存在。

     

R_OK,供阅读。

     

W_OK,写作。

     

X_OK,用于读取,写入和执行权限。

另外,例如,如果您需要检查读取和写入权限,则可以按位或在R_OK和W_OK之间(或者甚至在每三个R_OK,W_OK或X_OK之间)

有关详细信息,请在终端上输入 man access ,或访问上面的链接。

注意:access()是unistd.h库的一部分,即POSIX标准。如果您需要在其他系统下使用它,您可能需要包含不同的库。