C言語関数:chmod





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■chmod
ファイルのアクセスモードを変更

【分類】
ファイル操作関数

【書式】
int chmod(const char *filename, int amode);

【パラメータの型と説明】

パラメータ説明
const char *filenameファイル名(パス名)
int amodeチェックするモード

【機能説明】
filenameで指定したファイルの属性(アクセスモード)をamodeで指定した値に変更します。

amodeに指定できる値意味
S_IWRITE 読み書き可
S_IREAD 読み出し可
S_IREAD | S_IWRITE 読み書き可

アクセスモードを変更できたときは0、変更できなかったときは-1を返します。
ファイルに書き込み禁止属性(読み込み専用)をつけるときや、解除するときに使います。
ようするに、普通の状態かReadOnlyかのどちらかに変更することができます。

「S_IREAD」、「S_IWRITE」はインクルードファイル「fcntl.h」内でdefineされています。
Study Cでは、S_IREADに0x0100、S_IWRITEに0x0080が割り当てられています。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。 まず、テストに使用するファイルを作成します。

C:\StudyC\MyProg>echo test file>test.txt

C:\StudyC\MyProg>type test.txt
test file

これで読み書き可能な(普通の状態)ファイル「test.txt」が作成されました。
※echoコマンドは画面に文字列を表示するものです。 他の多くのコマンドでも同じですが、最後に「>ファイル名」を指定すると画面に表示される内容がファイルに書き込まれます。 また、「>>ファイル名」とするとファイルに追記されます。

C:\StudyC\MyProg>expr chmod("test.txt", 0x0100)
<int>0 0x0

C:\StudyC\MyProg>echo line add>>test.txt
標準出力ファイルがオープンできません.

C:\StudyC\MyProg>expr chmod("test.txt", 0x0080)
<int>0 0x0

C:\StudyC\MyProg>echo line add>>test.txt

C:\StudyC\MyProg>type test.txt
test file
line add

※↑カーソルキーを押すと入力したコマンドが呼び出されるので色々と変更して試してみてください。

1.chmod()関数を使用してファイル「test.txt」を読み込み専用に変更しています。
2.ファイル「test.txt」に「line add」という行を追加しようとしますが、書き込み時にエラーが発生しています。
3.chmod()関数を使用してファイル「test.txt」を読み書き可能な状態(普通の状態)に戻しています。
4.ファイル「test.txt」に「line add」という行を追加しています。
5.ファイル「test.txt」に行が追加されていることを確認しています。

※コマンドラインではインクルードファイルの内容を使用できないので「0x0100」などと直接値を指定しています。

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>
#include <fcntl.h>

main()
{
        FILE *fp;
        fp = fopen("test.txt", "w");
        if (fp == NULL)
        {
                printf("ファイルオープンエラー(1)\n");
                return;
        }
        fputs("TEST FILE\n", fp);
        fclose(fp);

        printf("読み込み専用:%d\n", chmod("test.txt", S_IREAD));
        fp = fopen("test.txt", "a");
        if (fp == NULL)
        {
                printf("ファイルオープンエラー(2)\n");
        }
        else
        {
                fputs("LINE ADD\n", fp);
                fclose(fp);
        }

        printf("読み書き可:%d\n", chmod("test.txt", S_IWRITE));
        fp = fopen("test.txt", "a");
        if (fp == NULL)
        {
                printf("ファイルオープンエラー(3)\n");
        }
        else
        {
                fputs("LINE ADD\n", fp);
                fclose(fp);
        }
}

実行結果は以下になります。

読み込み専用:0
ファイルオープンエラー(2)
読み込み可:0

1.最初のfopen()関数でファイル「test.txt」を作成しfputs()関数で「test.txt」と書き込んでいます。
2.chmod()関数でファイル「test.txt」を読み込み専用に変更しています。
3.2番目のfopen()関数でファイルに文字列を追記しようとしますが、読み込み専用なのでファイルオープンエラーとなっています。
4.chmod()関数でファイル「test.txt」を読み書き可(普通の状態)に変更しています。
5.2番目のfopen()関数でファイルに文字列を追記しています。

実行後にtypeコマンドでファイル「test.txt」の内容を確認すると以下のようになります。

C:\StudyC\MyProg>type test.txt
test file
line add

【参照関数】
access
remove
unlink