development

C에 파일이 있는지 확인하는 가장 좋은 방법은 무엇입니까?

big-blog 2020. 2. 22. 11:41
반응형

C에 파일이 있는지 확인하는 가장 좋은 방법은 무엇입니까?


단순히 파일을 여는 것보다 더 좋은 방법이 있습니까?

int exists(const char *fname)
{
    FILE *file;
    if ((file = fopen(fname, "r")))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

access()에서 찾은 기능을 찾으십시오 unistd.h. 기능을

if( access( fname, F_OK ) != -1 ) {
    // file exists
} else {
    // file doesn't exist
}

당신은 또한 사용할 수 있습니다 R_OK, W_OK그리고 X_OK대신에 F_OK(읽기 모두 확인 즉, 읽기 권한, 쓰기 권한을 확인하려면, 오히려 존재보다 (각각) 실행 권한을, 당신은 할 수 또는 함께의 사용하여 쓰기 권한 R_OK|W_OK)

업데이트 : Windows에서는 W_OK액세스 기능이 DACL을 고려하지 않으므로 쓰기 권한을 안정적으로 테스트 하는 사용할 수 없습니다 . access( fname, W_OK )파일에 읽기 전용 속성이 설정되어 있지 않아서 0 (성공)을 리턴 할 수 있지만 여전히 파일에 쓸 수있는 권한이 없을 수 있습니다.


다음과 같이 통계를 사용하십시오.

bool file_exist (char *filename)
{
  struct stat   buffer;   
  return (stat (filename, &buffer) == 0);
}

다음과 같이 호출하십시오.

if (file_exist ("myfile.txt"))
{
  printf ("It exists\n");
}

일반적으로 파일이 있는지 확인하려는 경우 해당 파일이 없는 경우 해당 파일 만들려고 하기 때문 입니다. Graeme Perrow의 답변은 해당 파일을 생성 하지 않으려 는 경우에 좋지만, 그렇지 않으면 경쟁 조건에 취약합니다. 다른 프로세스가 파일이 존재하는지 확인하는 사이에 파일을 생성하고 실제로 파일을 쓰기 위해 열 수 있습니다. . (웃지 마 ... 생성 된 파일이 심볼릭 링크라면 보안에 나쁜 영향을 줄 수 있습니다 !)

당신이 존재를 확인하려는 경우 , 존재하지 않는 경우 파일을 작성 원자 그래서 경쟁 조건이 없는지,이를 사용합니다 :

#include <fcntl.h>
#include <errno.h>

fd = open(pathname, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR);
if (fd < 0) {
  /* failure */
  if (errno == EEXIST) {
    /* the file already existed */
    ...
  }
} else {
  /* now you can use the file */
}

예. 사용하십시오 stat(). 에 대한 매뉴얼 페이지를 참조하십시오 stat(2).

stat()파일이 없으면 실패합니다. 그렇지 않으면 성공할 가능성이 큽니다. 존재하지만 디렉토리가 존재하는 디렉토리에 대한 읽기 액세스 권한이 없으면 실패하지만,이 경우 모든 메소드가 실패합니다 (접근 권한에 따라 보이지 않는 디렉토리의 내용을 어떻게 검사 할 수 있습니까? 간단하게, 당신은 할 수 없습니다).

다른 사람이 언급했듯이을 사용할 수도 있습니다 access(). 그러나 stat()파일이 존재하는 것처럼 즉시 유용한 정보를 많이 얻을 수 있습니다 (마지막으로 업데이트했을 때, 파일을 소유 한 소유자 및 / 또는 그룹, 액세스 권한 등).


FILE *file;
    if((file = fopen("sample.txt","r"))!=NULL)
        {
            // file exists
            fclose(file);
        }
    else
        {
            //File not found, no memory leak since 'file' == NULL
            //fclose(file) would cause an error
        }

Visual C ++ 도움말에서 나는 함께 갈 경향이 있습니다.

/* ACCESS.C: This example uses _access to check the
 * file named "ACCESS.C" to see if it exists and if
 * writing is allowed.
 */

#include  <io.h>
#include  <stdio.h>
#include  <stdlib.h>

void main( void )
{
   /* Check for existence */
   if( (_access( "ACCESS.C", 0 )) != -1 )
   {
      printf( "File ACCESS.C exists\n" );
      /* Check for write permission */
      if( (_access( "ACCESS.C", 2 )) != -1 )
         printf( "File ACCESS.C has write permission\n" );
   }
}

또한 모드 값을 주목할 가치가 있습니다 ._access(const char *path,int mode)

  • 00 : 존재 만

  • 02 : 쓰기 권한

  • 04 : 읽기 권한

  • 06 : 읽기 및 쓰기 권한

당신은 fopen파일이 존재하지만 요청으로 열 수 없습니다 상황에서 실패 할 수 있습니다.

편집 : 그냥 Mecki의 게시물을 읽으십시오. stat()더 깔끔한 방법으로 보입니다. 흠.


realpath () 함수를 사용할 수 있습니다.

resolved_file = realpath(file_path, NULL);
if (!resolved_keyfile) {
   /*File dosn't exists*/
   perror(keyfile);
   return -1;
}

나는 access () 함수 unistd.h가 좋은 선택 이라고 생각합니다 ( statLinux사용할 수 있습니다 ).

다음과 같이 사용할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>

void fileCheck(const char *fileName);

int main (void) {
    char *fileName = "/etc/sudoers";

    fileCheck(fileName);
    return 0;
}

void fileCheck(const char *fileName){

    if(!access(fileName, F_OK )){
        printf("The File %s\t was Found\n",fileName);
    }else{
        printf("The File %s\t not Found\n",fileName);
    }

    if(!access(fileName, R_OK )){
        printf("The File %s\t can be read\n",fileName);
    }else{
        printf("The File %s\t cannot be read\n",fileName);
    }

    if(!access( fileName, W_OK )){
        printf("The File %s\t it can be Edited\n",fileName);
    }else{
        printf("The File %s\t it cannot be Edited\n",fileName);
    }

    if(!access( fileName, X_OK )){
        printf("The File %s\t is an Executable\n",fileName);
    }else{
        printf("The File %s\t is not an Executable\n",fileName);
    }
}

그리고 당신은 다음과 같은 결과를 얻습니다 :

The File /etc/sudoers    was Found
The File /etc/sudoers    cannot be read
The File /etc/sudoers    it cannot be Edited
The File /etc/sudoers    is not an Executable

참고 URL : https://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a-file-exists-in-c



반응형