• ベストアンサー

【C言語】オープンモードのマジックナンバーについて

こんにちは。プログラミング初心者です。 アクセス関数のオープンモードをシンボルで記載する場合、 どのように書けばよいでしょうか。 以下、ディレクトリの存在を確認する関数を作成しました。 int dir_exist ( const char *dirname ) { int rtn = -1; rtn = access(dirname, 06); return rtn; } 06のところをシンボルで書きたいのです。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

参考までにどうやって自分が調べたかを書いておきます。 man accessでaccessがどういう関数で、何をincludeすれば良く、どういうmodeを取るかを調べます。 ここで、unistd.hをインクルードし、R_OKなどを取るということがわかります。 まず、/usr/include/unistd.hを探しますが、見つかりません。あとはunistd.hがincludeしているものを一つ一つ調べます。 すると、/usr/include/sys/unistd.hにR_OKというのがあるのが見つかりました。 06というのは02 | 04なので、ここのdefine文から逆算してW_OK | R_OKというのがわかりました。

itkirai-85
質問者

補足

ご説明ありがとうございます。 実際にどのように記載したら良いのかが知りたいのですが、 以下の通りでご説明いただいた内容と合っていますでしょうか? #include <unistd.h> int dir_exist ( const char *dirname ) { int rtn = -1; rtn = access(dirname, W_OK | R_OK); return rtn; } また、上記のソースでディレクトリの存在は確認できますでしょうか。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>環境はLinuxを想定しています。 Linuxを想定しているならLinuxのman accessで調べましょう。 Visual C++だとaccessがプロトタイプ宣言されているヘッダファイルも異なりますので参考にはなりますけど、それをそのまま鵜呑みにしてはダメです。 >ディレクトリの存在確認をするのに適当な関数は何か他にありますでしょうか。 stat 詳細はman 2 statで調べてみてください。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

そのaccessの第2引数の06の意味はなんなのでしょうか? unix系OSの場合、man accessで調べても数値では説明されていませんので数値の意味がunixにより異なる可能性があります。ですので06と書かれても意味もわからなければ環境も書かれていないので調べようがありません。(R_OK|W_OKでだいたいあってはいるとは思いますけど) MS-CやVisualC++の場合では、マクロが定義されてませんので自分で定義しない限りは数値で書くしかないです。 それとaccessはアクセスできるモードを調べるだけでディレクトリかどうかは調べませんけど、それでよいのでしょうか?

itkirai-85
質問者

補足

すみません。説明不足でしたので、補足します。 環境はLinuxを想定しています。 06は、Windowsのリファレンスでアクセス関数を調べたときに、 読み取り書き込みのアクセス許可のモードとして、06という番号を指定すると記載されていました。 http://msdn.microsoft.com/ja-jp/library/1w06ktdy(v=vs.71).aspx >それとaccessはアクセスできるモードを調べるだけでディレクトリかどうかは調べませんけど、それでよいのでしょうか? ディレクトリの存在確認をするのに適当な関数は何か他にありますでしょうか。

関連するQ&A