25.C言語拡張ディレクトリとファイルの操作


そのような知識はそれほど部動作導入に時間が経過した後、運転時間に来るのでこのセクションでは、いくつかのより多くの知識ディレクトリとファイルの操作を拡張します。

A、アクセスライブラリ関数

アクセス機能は、ファイルまたはディレクトリへの現在のオペレーティングシステムのユーザーのアクセスを決定するために使用されます。

ヘッダファイルを含めます:

#include <unistd.h>

関数の宣言:

int access(const char *pathname, int mode);

パラメータ:

パス名のファイルまたはディレクトリ名は、カレントディレクトリのファイルまたはディレクトリをすることができ、あなたは完全なパスを一覧表示することができます。

これは、アクセスモードの決意が必要です。Unistd.hは、ヘッダファイルを事前定義以下の通りであります:

#define R_OK 4     // R_OK 只判断是否有读权限
#define W_OK 2    // W_OK 只判断是否有写权限
#define X_OK 1     // X_OK 判断是否有执行权限
#define F_OK 0     // F_OK 只判断是否存在

戻り値:

モードは、パス名0を返されたときの条件が満たされた場合、-1満足されていません。

実際の開発では、アクセス機能は、主に、ファイルまたはディレクトリが存在するかどうかを決定するために使用されます。

二、Statライブラリ関数

1、stat構造体

以下のように、ファイルやディレクトリのための店状態情報へのstat構造をストラクト:

struct stat
{
  dev_t st_dev;   // device 文件的设备编号
  ino_t st_ino;   // inode 文件的i-node
  mode_t st_mode;   // protection 文件的类型和存取的权限
  nlink_t st_nlink;   // number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.
  uid_t st_uid;   // user ID of owner 文件所有者的用户识别码
  gid_t st_gid;   // group ID of owner 文件所有者的组识别码
  dev_t st_rdev;  // device type 若此文件为设备文件, 则为其设备编号
  off_t st_size;  // total size, in bytes 文件大小, 以字节计算
  unsigned long st_blksize;  // blocksize for filesystem I/O 文件系统的I/O 缓冲区大小.
  unsigned long st_blocks;  // number of blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节.
  time_t st_atime;  // time of lastaccess 文件最近一次被存取或被执行的时间, 一般只有在用mknod、 utime、read、write 与tructate 时改变.
  time_t st_mtime;  // time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、 utime 和write 时才会改变
  time_t st_ctime;  // time of last change i-node 最近一次被更改的时间, 此参数会在文件所有者、组、 权限被更改时更新
};

構造体stat構造体のメンバ変数は、その上のst_mode、st_sizeとst_mtimeの両メンバーに集中するより、プログラマのためです。注st_mtimeの両時間が整数式は、コード変換フォーマットを書き込むために、プログラマが必要です。

多くのメンバーは値をst_modeのか、以下の二つのマクロを使用して決定しました。

S_ISREG (st_mode) 是否为一般文件 
S_ISDIR (st_mode) 是否为目录 

2、STATライブラリ関数

ヘッダファイルを含めます:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

関数の宣言:

int stat(const char *path, struct stat *buf);

STAT機能指定したファイルまたはディレクトリのパス情報を取得し、bufに構造体に情報を保存するために、実装を成功戻り0、-1失敗。

実施例(book145.c)

/*
 * 程序名:book145.c,此程序演示目录和文件的存取权限和状态信息
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

// 本程序运行要带一个参数,即文件或目录名
int main(int argc,char *argv[])
{
  if (argc != 2)  { printf("请指定目录或文件名。\n"); return -1; }

  if (access(argv[1],F_OK) != 0) { printf("文件或目录%s不存在。\n",argv[1]); return -1; }

  struct stat ststat;

  // 获取文件的状态信息
  if (stat(argv[1],&ststat) != 0) return -1;

  if (S_ISREG(ststat.st_mode)) printf("%s是一个文件。\n",argv[1]);
  if (S_ISDIR(ststat.st_mode)) printf("%s是一个目录。\n",argv[1]);
}

業績

ここに画像を挿入説明

三、UTIMEライブラリ関数

UTIME機能は、ファイルのアクセス時刻、および修正時刻を変更するために使用されます。

ヘッダファイルを含めます:

#include <utime.h>

関数の宣言:

int utime(const char *filename, const struct utimbuf *times);

関数の説明:UTIMEは()inodeファイルが属するパラメータファイル名の変更に使用された
アクセス時間を。パラメータ回ヌル・ポインタ(NULL)場合は、
ファイルのアクセス時間のすべてと時間を変更するには、現在の時刻に設定されます。次のようにUtimbuf構造が定義されています。

struct utimbuf
{
  time_t actime;
  time_t modtime;
};

戻り値:0を返す正常に実行された場合、故障-1。

四、ライブラリ関数の名前を変更

ファイルまたはディレクトリの名前を変更する機能の名前を変更、mvコマンドは、オペレーティングシステム、プログラマに相当し、プログラムはめったにディレクトリの名前を変更しませんが、名前変更ファイルは、頻繁な機能を使用しています。

ヘッダファイルを含めます:

#include <stdio.h>

関数の宣言:

int rename(const char *oldpath, const char *newpath);

パラメータ:

以前はoldpathがファイルまたはディレクトリとして知られています。

ファイルまたはディレクトリの新しい名前NEWPATH。

戻り値:0成功-1-失敗。

五、削除ライブラリ

remove関数は、ファイルやディレクトリ、rmコマンドのオペレーティングシステムと同等のものを削除するために使用されます。

ヘッダファイルを含めます:

#include <stdio.h>

関数の宣言:

int remove(const char *pathname);

パラメータ:

削除するファイルまたはディレクトリ名のパス名。

戻り値:0成功-1-失敗。

第六に、放課後の仕事

1)する場合、例えば、MKDIR( "/ tmpに/ AAA / BBB / CCC"、00755)MKDIRでディレクトリを作成し、あなたのライブラリーを豊かにし続ける;、親ディレクトリ(/ tmpに/ AAAまたは/ tmp / AAA場合は、存在しません/ BBB)が存在しない、それは/ tmpに/ AAA / BBB / CCCディレクトリを作成することができません、これはプログラマたくないです、私たちは、親ディレクトリが存在しない場合は、関数を記述親ディレクトリを作成し、1つのレベルにしたいです作成し、次のように関数を宣言:

int MKDIR(const char *pathname);

2)時間の関数を取得するために文書を準備するために、ステートメント次

// 获取文件的时间,即modtime
void FileMTime(const char *in_FullFileName,char *out_ModTime);

out_ModTime形式は "YYYY-MM-DD HH24:MI:SS" です。

3)は、次の文を、ファイルサイズを取得するための関数を記述します。

// 获取文件的大小,返回字节数
int FileSize(const char *in_FullFileName);

4)rename関数が不足している、親ディレクトリnewpathをターゲットファイル名のディレクトリが存在しない場合は、関数が返す障害が、新しいRENAME機能を書き換え、親ディレクトリが存在しないnewpathがあれば、newpathが親ディレクトリを作成し、名前の変更、関数の宣言は次の通り:

int RENAME(const char *oldpath, const char *newpath);

5)2番目のパラメータは、関数UTIME構造utimbufがあり、不便は実際の開発で使用するために、私たちのような、時間形式は文字列です願っています:「2019年2月8日
12時05分〇二秒」、 UTIME時間文字列形式関数宣言に関数、同一の機能UTIMEが、第二のパラメータをオーバーライド以下の通りであります:

int UTIME(const char *filename, const char *strtime);

七、著作権表示

C言語Technology Networkのオリジナルの記事、論文、著者と元にソースリンクを明記してくださいを再現。
出典:C言語テクノロジーネットワーク(www.freecplus.net)
著者:倫理コード農業

記事の誤字、またはコンテンツのエラー、またはその他の提案やコメントは、正しい私にメッセージをお願いした場合、どうもありがとうございました!

公開された29元の記事 ウォンの賞賛2 ビュー665

おすすめ

転載: blog.csdn.net/m0_45133894/article/details/104654794