Как проверить, находится ли файл в данном каталоге - PullRequest
0 голосов
/ 07 апреля 2019

Я пытался найти это во многих словах, но по какой-то причине мне даны только ссылки на такие вопросы, как «Как проверить, существует ли файл или каталог».Вместо этого я хотел бы проверить, находится ли данный файл в заданном каталоге.

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

Есть ли какая-нибудь функция windows / unix, которая проверяет это?

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

здесь приведен пример использования функции stat() независимо от того, является ли имя файла полным путем или просто именем файла

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>



#if 0
           struct stat {
               dev_t     st_dev;         /* ID of device containing file */
               ino_t     st_ino;         /* Inode number */
               mode_t    st_mode;        /* File type and mode */
               nlink_t   st_nlink;       /* Number of hard links */
               uid_t     st_uid;         /* User ID of owner */
               gid_t     st_gid;         /* Group ID of owner */
               dev_t     st_rdev;        /* Device ID (if special file) */
               off_t     st_size;        /* Total size, in bytes */
               blksize_t st_blksize;     /* Block size for filesystem I/O */
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */
               struct timespec st_mtim;  /* Time of last modification */
               struct timespec st_ctim;  /* Time of last status change */

           #define st_atime st_atim.tv_sec      /* Backward compatibility */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };
#endif

bool doesFileExistInDir( char *path, char *filename )
{
    struct stat myStat;
    int statStatus;

    char pathname[ strlen(path) + strlen( filename ) + 1];

    if( !strchr( filename, '/' ) )
    { 
        pathname[0] = '\0';
        strcat( pathname, path );
        // strcat( pathname, "/" );
        strcat( pathname, filename );
    }
    else
    {
        strcpy( pathname, filename );
    }

    if( (statStatus = stat( pathname, &myStat )) != 0 )
    {
        // then file not accessible -or- directory not readable -or- file does not exist
        perror( "stat failed" );
        return false;
    }

    return true;
}
0 голосов
/ 07 апреля 2019

Эту функцию можно использовать для определения, является ли dirname каталогом filename.

int file_is_in_directory (char *filename, char *dirname) /* [!] Windows-specific */
{
    char   filename_full[MAX_PATH] = {'\0'};
    char   dirname_full[MAX_PATH]  = {'\0'};
    char*  file                    = NULL;

    GetFullPathNameA(filename,  MAX_PATH,   filename_full,  NULL); /* [!] Check rval */
    GetFullPathNameA(dirname,   MAX_PATH,   dirname_full,   NULL); /* [!] Check rval */

    if(!strncmp(dirname_full, filename_full, strlen(dirname_full)))
    {
        return 1; /* File is located in directory */
    }

    return 0; /* File not contained */
}
...