2011-08-11 2 views
5

간단한 질문 :C 파일 작업 : 열려있는 파일 포인터 액세스 모드 확인

이미 열린 파일 포인터의 액세스 모드는 어떻게 확인합니까?

그래서 함수가 이미 열려있는 파일 포인터 전달되는 말 :

//Pseudo code 
    bool PseudoFunction(FILE *Ptr) 
    { 
     if(... Insert check for read-only access rights) 
     { 
      //It's read only access mode 
      return true; 
     } 
     //File pointer is not read-only and thus write operations are permitted 
     return false; 
    } 

내가으로 열립니다했던 FILE 포인터를 확인하기 위해 if 문에서 사용하는 것이 무엇 읽기 전용 (또는하지 않는 경우와 파일에 쓰지 않고 사용자가 (아마도 모순되는) 인수를 전달하지 않고도 가능합니까?

시스템은 windows, code :: blocks 컴파일러이지만 코드 이식성, 상호 호환성 우선 순위를 위해.

참고로 파일 권한에 대해서는 묻지 않지만 FILE 포인터는 어떤 액세스 모드를 사용했는지 유의하십시오.

SELF-ANSWER [인해 사용자 권한 제한으로 별도의 대답을 추가 할 수 없습니다] :

그 이전으로

제안 적절한 # 정의를 포함 아래에 또 다른 포스터에 의해 더 나은 답이있다 FILE 포인터의 _flag (_iobuf에 정의 된대로)는 파일이 읽기 전용인지 여부를 알 수있는 키입니다. 마일리지 비록 다를 수 있지만, 동일한 기본적인 개념이 쉽게 적응할 수 있어야 예 번호 :

Output: 
w: 2 
r: 1 File is read only! 
a: 2 
wb: 2 
rb: 1 File is read only! 
ab: 2 
w+: 128 
r+: 128 
a+: 128 
w+b: 128 
r+b: 128 
a+b: 128 
: 모든 다른 액세스 모드 조합은 상기 기능을 사용하는 경우의 출력을 생산하고

#define READ_ONLY_FLAG 1 

bool PrintFlagPtr(const char FileName[], const char AccessMode[]) 
{ 
    FILE *Ptr = NULL; 
    Ptr = fopen(FileName,AccessMode); 
    printf("%s: %d ",AccessMode,Ptr->_flag); 

    int IsReadOnly = Ptr->_flag; 
    fclose(Ptr); 
    Ptr = NULL; 


    if((IsReadOnly&READ_ONLY_FLAG) == READ_ONLY_FLAG) 
    { 
     printf("File is read only!\n"); 
     return true; 
    } 

    printf("\n"); 
    return false; 
} 

궁금한 점은 크로스 - 호환 프론트 - 엔드 함수 (플랫폼에 따라 선언이있는 같은 이름의 함수)가 주어진 이유는 무엇입니까? 주어진 FILE 포인터 _flag는 문제에 대한 아주 간단하고 쉬운 해결책이 될 것입니다.

+0

오라클을 사용하여 프로그램 내에서 쉽게 알려진 것을 발견하지 마십시오. 어떤 코드는 FILE을 만들었고, 그 코드는 어떻게 생성되었는지 * 알고 있습니다. 함수에 인수를 추가하십시오. –

+0

사실, 사용자가 파일에 어떤 액세스 권한이 있는지 알려주는 것은 보안 취약성을 감안할 때 나쁜 형식 (명시된대로)입니다. 그리고 이것은 예측이 아니라 프로그래밍입니다. 코드의 일부는 putc 및 유사한 명령을 사용할 때 오류를 일으킬 수있는 액세스 권한이 무엇인지 이미 알고 있습니다. – SSight3

+0

사용자가 사용자와 관련이 있다고 생각하는 이유를 알 수 없습니다. 함수에 인수를 전달하려면 C 프로그래머가 필요합니다. 프로그래머를 신뢰하지 않으면 모든 배팅이 해제됩니다. –

답변

2

경고 :이 답변은 Visual Studio 2010에서 Visual Studio 2010을


표준 입출력에 따라 다릅니다.비주얼 스튜디오 2010와 함께 제공 H 파일은 다음과 같은 파일 형식을 정의합니다

struct _iobuf { 
    char *_ptr; 
    int _cnt; 
    char *_base; 
    int _flag; 
    int _file; 
    int _charbuf; 
    int _bufsiz; 
    char *_tmpfname; 
}; 
typedef struct _iobuf FILE; 

은 "RB"모드로 파일을 fopening,이 0x00000001 인 경우 값을 가져옵니다.

#define _IOREAD   0x0001 
#define _IOWRT   0x0002 
#define _IORW   0x0080 

기본이되는 파일 :

r _IOREAD 
w _IOWRT 
a _IOWRT 
+ _IORW 

이러한 상수는 STDIO.H에 정의되어 다음 fopen을 기능에

은, 당신이 interesed있는 플래그 중 일부는이 같은 매핑 할 수 있습니다 기술자가 더 많은 정보를 포함하고 있습니다.

+0

답안이 제 대답보다 많은 정보를 포함하고 있기 때문에 (나는 code :: blocks [코드 :: 블록에서도 작동하지만 비슷한 컨텍스트]에서 #define을 찾을 수 없습니다.), 귀하의 것을 선택하겠습니다._file에 액세스하는 프론트 엔드 함수의 제안을 추가하는 것은 다른 운영 체제에서 사용되므로 함수를 다시 정의 할 수 있습니다. 고맙습니다! – SSight3

1

달성 할 수있는 표준 방법이 없습니다. 반환 값이 O_RDONLY 또는 같은 플래그의 조합으로 정수입니다

int get_file_status(FILE* f) { 
    int fd = fileno(f); 
    return fcntl(fd, F_GETFL); 
} 

참고 :

+0

FILE 포인터 아래에서 _flag에 액세스하는 것은 어떻습니까? 확실히 이것은 int 플래그로서의 읽기/쓰기 속성을 포함하고 있습니다. 그리고 미리 정의 된 숫자와 비교해 보면 알 수 있습니다. 이것이 frowned하게 될지도 모르겠지만 _flag가 const로 취급되고 커버하에 다루어지는 한 (그리고 아마도 어색한 work arounds보다 낫지 만) 왜 그리 좋지 않은지 나는 알지 못합니다. 프로그램이 FILE 포인터가 읽기 전용이라는 것을 알 수있어 프로그래머가 할 수 없듯이 필자는 쓰기를 거부합니다. – SSight3

+1

FILE이 (가) 불투명하다면 어떤 멤버가 있는지 알 수 없습니다. – AProgrammer

+0

클래스 FILE {};을 (를) 작성하는 중입니다. 컴파일러가 이전에 선언 된 FILE 인스턴스에 대해 불평하도록 강요하면 멤버의 멤버가 표시됩니다. 잘 정의 된 _iobuf 클래스이므로 필요할 경우 항상 온라인으로 검색 할 수 있습니다. – SSight3

3

리눅스 (그리고 아마도 모든 UNIX 시스템)에서 당신은 파일의 액세스 모드를 얻을 수 fcntl을 사용할 수 있습니다 O_RDWR 아니요 "r" 또는 "w+" 문자열이 아닙니다. 이러한 플래그 중 일부는 http://pubs.opengroup.org/onlinepubs/007908799/xsh/open.html을 참조하십시오.

Windows에 대한 정보는 On Windows/mingw, what is the equivalent of `fcntl(fd, F_GETFL) | O_ACCMODE`?을 참조하십시오.

+0

Windows 용으로 링크 된 질문은 7 개월 된 것으로 보이며 답변이 없습니다. – SSight3