2011-08-11 8 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 [によるユーザー権利の制限のために、別の答えを追加することはできません]:

先に示唆したように、その下に別のポスターによるより良い答えが正しいの#define

を含んであります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; 
} 

なぜ互換性のないフロントエンド関数(同じ名前の関数であり、プラットフォームによっては宣言がある)が与えられたconst intを渡すと、これは決して提案されなかった与えられたFILEポインタ_flagは、問題に対する非常に簡単で簡単な解決策になります。

+0

オラクルを使用して、プログラム内で容易に知ることができないようにします。いくつかのコードはFILEを作成し、そのコードはどのように作成されたかを知っています。関数に引数を追加します。 –

+0

実際には、ユーザーがファイルにどのようなアクセス権があるかを伝えることは、セキュリティ上の脆弱性があることを前提とした悪質な形式です。これはプログラミングであり、予測ではありません。コードの一部は、putcや同様のコマンドを使用しているときにエラーになるためのアクセス権が何であるかをすでに知っています。 – SSight3

+0

なぜあなたはユーザーがこれと何か関係があると思いますか?関数に引数を渡すには、Cプログラマが必要です。プログラマーを信頼しないと、すべての賭けはオフになります。 –

答えて

2

警告:この答えは、Visual Studio 2010


はstdioに固有のものです。Visual Studio 2010に付属している時間、ファイルは次のようにファイルタイプを定義します。

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の値を取得します。

関数fopenで

、あなたがこのとしてマッピングすることが可能でinteresedだフラグのいくつか:

r _IOREAD 
w _IOWRT 
a _IOWRT 
+ _IORW 

これらの定数は、stdio.hで定義されています。

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

基礎となるファイル記述子にはより多くの情報が含まれていますが、私はまだ掘り下げていません。

+0

あなたの答えは私の答えよりも多くの情報を含んでいます(私は#defineをcode :: blocksで見つけることができませんでしたが、同様のコンテキスト)、あなたのものを選択します。私は_fileにアクセスするフロントエンド関数の提案を追加するだけで、さまざまなオペレーティングシステムで関数を再定義することができます。ありがとうございました! – SSight3

1

これを達成するための標準的な方法はありません。 Linuxの

+0

FILEポインタの下で_flagにアクセスするとどうなりますか?確かに、これにはintフラグとしての読み取り/書き込み属性が含まれています。これが嫌になるかもしれないと確信していますが、_flagがconstとして扱われ、カバーの下で扱われている限り、なぜそうは思わないのですか?プログラムがFILEポインタが読み込み専用であることを知ることができます(したがって書き込みを拒否します)が、プログラマはできません。 – SSight3

+1

FILEは不透明ですが、あなたはどのメンバを持っているのかわかりません。 – AProgrammer

+0

クラスFILE {}を書いているだけです。以前に宣言されたFILEのインスタンスについてコンパイラーが文句を言うように強制すると、メンバーのメンバーが明らかになります。よく定義された_iobufクラスであるため、必要に応じて常にオンラインで検索することができます。 – SSight3

3

(そしておそらくすべてのUNIXシステム)あなたは、ファイルのアクセスモードを取得するためにfcntlを使用することができます。返された値がO_RDONLYなどのフラグの組み合わせとして整数であることを

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

注意を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

あなたのウィンドウにリンクしている質問は、7か月のように見え、答えがありません。 – SSight3

関連する問題