
No.1ベストアンサー
- 回答日時:
acceess()は元々UNIXのシステムコールであり、POSIX準拠OS以外では互換性が保証されません。
これはsignal()などとともに「移植性を阻害する標準関数」の筆頭に分類されます。
環境が指定されていないのでPOSIXのaccess(2)を想定します。
#inclue <io.h>
int access(const char *, int) ;
第1引数:ファイルパス名
第2引数:チェックするモード(0=存在、2=書きこみ、4=読み出し,6=読み書き)
関数値が-1の時、グローバル変数errnoに以下の値がセットされます。
EACCESS=指定したアクセス権が許可されていない
ENOENT=ファイルが損さしない
(errnoを使用するためにはerrno.hが必要)
ファイルの存在チェックだけならmacros.hのexist()マクロかstat(2)の方が楽なのではないでしょうか。
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *, struct stat *) ;
#include <sys/types.h>
#include <sys/stat.h>
#include <macros.h>
int exist(const char *) ;
POSIX以外の処理系の場合、OSとコンパイラを指定してください。
この回答への補足
さっそくのご回答ありがとうございます。
さっそくWindows98のVisualC++と
VineLinuxとFreeBSDのgccで試してみました。
VCではio.hが存在したのですがgccでは存在しませんでした。又、macros.hはどちらにも存在しませんでした。
そこで、申し訳ないのですが、再び教えていただけないでしょうか?
VCでaccess関数を使ってみたのですが、戻り値が何を意味してるかがわかりません。
0と-1だけを返してるように見えますが、
0なら「O.Kです」、-1なら「ダメです」、というような解釈をしていいのでしょうか?
それとstat関数ですが、ファイルの存在チェックをする場合、
第2引数には何を与えればいいのでしょうか?
ちなみにVCのstat.h中の構造体statは以下のようになっています。
struct stat {
_dev_t st_dev;
_ino_t st_ino;
unsigned short st_mode;
short st_nlink;
short st_uid;
short st_gid;
_dev_t st_rdev;
_off_t st_size;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
};
No.4
- 回答日時:
それから、補足ですが、stat() を使うか、access() を使うかは、
用途が違うと考えてください。「ファイルの存在の有無を確認」の
意味によって、どちらを使うかが決まります。
本当に、存在するかどうかだけで以降の処理が決まるなら、stat()
を使うのがいいでしょう。ただし、シンボリックリンクとしてだけ
存在して、その先がなくてもいいなら、lstat() がいいかもしれま
せん。
それを読めるかどうか、書けるかどうかが重要な場合は access()
を使うべきです。しかし、単に読めるかどうか、書けるかどうかだ
けじゃなくてそれがファイルなのか、ディレクトリなのか、シンボ
リックリンクなのか、といった様々な可能性もチェックして正しい
処理をしたいという場合には、stat(), lstat() も併用する必要が
あります。
さらに、stat() してから、次のアクションを起こすまでに、誰か
がファイルを消したり、パーミションを落としたりしたら、どうし
たらいいかまで考えはじめると、きりがないですが…。
No.3
- 回答日時:
stat() や access() 等のUNIXのシステムコール関数は、通常 man
に必要十分な情報が載っています。
man 2 stat
man 2 access
等、されてみたでしょうか?英語であったとしても、難しい文法は
使っていませんので、すぐに慣れると思います。OSによっては、日
本語のマニュアルが用意されている場合もありますが、かえってわ
かりにくいこともあるので、原文を参照する習慣をつけるのがいい
です。
例えば、FreeBSDの man によると、stat() の RETURN VALUES は、
Upon successful completion a value of 0 is returned. Otherwise, a value of -1 is returned and errno is set to indicate the error.
ですので、「stat() が成功したとき(ファイルの属性が得られた
とき)に 0 を返し、それ以外では -1 を返して errno に値がセッ
トされる」という意味になります。どういうときに属性が得られな
いことがあるかというと、ERRORS の項を見ると、パスの途中にディ
レクトリでないものがあった、とか、名前が長すぎる、とか、ファ
イルが存在しない、とか、途中のディレクトリにアクセス許可がな
かった、とか、などなどです。
access() に関しても同様ですが、これの主な用途は、自分にとっ
てそのファイルが本当に読み書きできるかを調べるものですので、
可能なら 0 を返し、そうでなければ -1 を返します。ERRORS に関
しては似たようなものですが、-1 を返すかどうかは、どういうモー
ドでのアクセス可能性を問い合わせたかによって変化します。その
意味では、単にファイルのモード等を取り出すだけの stat() とは
異なります。また、access() では、ファイルシステムが readonly
のときに、書き込みができないこともチェックできます。(EROFS
がセットされる)
MSDNというのがマイクロソフトのサービスのことだとすれば、UNIX
に関する情報はあんまり期待できないのではないかと思いますが、
試したことがないのでわかりません。
errno を知りたければ、/usr/include/sys/errno.h を見るのはい
かがですか?ただし、各システムコールで、異なるエラーを同じ
errno で表現したりもしますから、結局 man を見て errno ごとの
意味を読み取るのが正確ですが。
manだけでは不安とか実例がいっぱい欲しいという場合には、書籍
もありますので、「UNIX システムコール プログラミング」などを
キーワードにして、検索してみてください。
とてもためになるお話をありがとうございます。おかげさまで自由に使えるくらいの知識ができたと思います。
書籍の件でもUNIXと聞いて、はっとしました。そういう本を探したことがありませんでした。そういえば他の方で書籍についての質問をしていた方がいましたので、そこを見れば非常に興味深い回答がありました。
それにしてもある程度Cができるようになったらその先はまずUNIXを学ばねばならないのでしょうか?
その辺に関わることをまた別の質問をしたいと思いますのでお暇がありましたらどうかよろしくお願いします。
では、回答をくださったおふた方様、ありがとうございました。
No.2
- 回答日時:
実は数日前にOSをクリーンインストールしてまして、GCC(Cygnus GNU Win32ですが)が入ってないんです。
すみません、GCCについてはちょっと時間がかかりますので他の方の回答が早いかもしれません。
POSIXを想定してたのでmacros.hを持ち出したのですが、ANSI標準ではないので他の処理系では存在しないかもしれません。
access()の関数値は
0=処理が正常に終了
-1=失敗
です。
第2引数が0の場合関数値が0なら「ファイルは存在する」なのですが、-1であっても「存在しない」とは限りません。
そこで、errnoで詳細を確認する必要が出てくるのです。
代表的な例としてはEINTRで、「割り込み発生」を示します。
この場合はファイルは存在します。
stat()の第2引数には常にstruct statのアドレスを渡します。
struct stat st ;
if (stat("c:\\xxx.dat", &st) == -1) {
switch (errno) {
case ENOENT :/* ファイル無し */
case EINTR : /* 割り込み発生(正常) */
default : /* その他のエラー */
perror("c:\\xxx.dat") ;
}
}
このような使い方になります。
なぜ、access()よりstat()をお勧めするかと言うと…。
access()の第2引数は処理系依存だからです。
MSDNでも_access()となっており互換性はWin95/NTです。
この回答への補足
本当にありがとうございます。おかげさまでファイルの存在チェックがだいたいマスターできました。
最後に少々お聞きしたいのですが、
stat関数の関数値とaccess関数の関数値は同じ意味であると解釈してもいいのでしょうか?
それと、どのような本を探せばこのような内容が説明してあるのでしょうか?このような内容や、errnoの全ての値の意味などを勉強してみたいと思うのですが、探し方が悪いのか、それとも住んでる所が田舎すぎるのか、sys内のヘッダファイルを使うような本を見たことがありません。
それともこれらの事はmanやMSDNで調べるべきなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(パソコン・スマホ・電化製品) EXCELのSUMPRODUCT関数について 2 2022/09/21 17:30
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- その他(データベース) Microsoft Accessについて 1 2022/06/06 16:20
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- その他(データベース) 20万行あるデータを動かしたい 2 2023/06/13 15:21
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- 観光地・ランドマーク K-ETA申請費用について 2 2022/09/27 14:27
- 数学 数学の問題の解き方を教えてください! 3 2022/11/02 17:32
- Access(アクセス) Microsoft Accessをクレジットカード登録無しで試用したい 3 2023/07/20 17:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
社内Excel共有ブックでの保存ト...
-
共有フォルダに誰が何にアクセ...
-
Batch: フォルダ内の特定のファ...
-
AccessVBAで作成したExcelファ...
-
VBAでCSVファイルが使用中かど...
-
相手のPCにVBAからメッセ...
-
月が変わったら自動でシートが...
-
Excel VBA 処理後データが重た...
-
(Excelマクロ)datファイルをエ...
-
Dream weaverで、誤ってファイ...
-
Access2003 デザインモードで...
-
JSONファイルの置き場所について
-
Access VBA を利用して、フォル...
-
【アクセス】「ほかのユーザー...
-
excelを共有ファイルにすると行...
-
ホームページ作成中に溜まる不...
-
仕事のファイルを共有フォルダ...
-
特定のエクセルファイルを起動...
-
拡張子が「cda」のファイルを聞...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
特定のエクセルファイルを起動...
-
Batch: フォルダ内の特定のファ...
-
共有フォルダに誰が何にアクセ...
-
Access VBA を利用して、フォル...
-
VBAでCSVファイルが使用中かど...
-
AccessVBAで作成したExcelファ...
-
(Excelマクロ)datファイルをエ...
-
excelを共有ファイルにすると行...
-
【アクセス】「ほかのユーザー...
-
社内Excel共有ブックでの保存ト...
-
tmpファイル なぜできる?削除...
-
拡張子が「cda」のファイルを聞...
-
WEBクエリが使えない場合のHPデ...
-
月が変わったら自動でシートが...
-
Excel VBA 処理後データが重た...
-
ファイルの途中に文字列を挿入
-
相手のPCにVBAからメッセ...
-
mdbファイル フォームを開くと...
-
大量のCSVデータを行列の変換を...
おすすめ情報