C/C++如何获得文件属性?

eoppggx 2007-07-12 12:37:53
rt
...全文
991 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-07-12
  • 打赏
  • 举报
回复
unix 系统下:

【Ref:http://www.tongyi.net/os/unix/1055532.html】
如何在程序中获得文件的属性。这里需要用到三个函数,它们的定义是:
#include <sys/types.h>
#include <sys/stat.h>

int stat(const char* pathname, struct stat* buf); //成功则返回0,失败返回-1
int fstat(int fd, struct stat* buf);     //成功则返回0,失败返回-1
int lstat(const char* pathname, struct stat* buf); //成功则返回0,失败返回-1

  stat()函数接收一个文件名,返回该文件的stat结构。fstat()接收一个已打开的文件描述符,返回该文件的stat结构。lstat()与stat()类似,但对于符号链接,它返回该符号链接的stat结构,而不是该符号链接所引用文件的stat结构。stat结构是一包含了文件所有属性信息的结构,它的定义如下:

struct stat{
mode_t st_mode; //file type & mode
ino_t st_ino; //i-node number
dev_t st_dev; //device number
dev_t st_rdev; //device number for special files
nlink_t st_nlink; //number of links
uid_t st_uid; //user ID of owner
gid_t st_gid; //group ID of owner
off_t st_size; //size in bytes,for regular files
time_t st_atime; //time of last access
time_t st_mtime; //time of last modification
time_t st_ctime; //time of last file status change
long st_blksize;//best I/O block size
long st_blocks; //number of 512 bytes blocks allocated
};

  stat结构中最常用到的属性是st_mode(文件的类型及文件的访问权限)、st_nlink(硬链接数,表示有几个链接到该文件上)、st_uid、st_gid、st_size(以字节为单位的文件长度,只对普通文件、目录文件和符号连接有意义)、st_atime、st_mtime、st_ctime。
我们曾一再提到Unix系统中一切皆可视为文件,不过细而化之的话又可以分为多种类型,那么在程序中如何去对文件类型进行判别呢?这就需要用到下表中所示的一些宏:

宏 作用
S_ISREG() 测试是否为普通文件
S_ISDIR() 测试是否为目录文件
S_ISCHR() 测试是否为字符特殊文件
S_ISBLK() 测试是否为块特殊文件
S_ISFIFO() 测试是否为FIFO文件
S_ISLNK() 测试是否为链接文件
S_ISSOCK() 测试是否为socket文件
S_ISUID() 测试是否设置了“设置-用户-ID”位
S_ISGID() 测试是否设置了“设置-组-ID”位


  [程序6]

  #include <stdio.h>
  #include <stdlib.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <unistd.h>

  int main(int argc, char * argv[])
{
    int i;
    struct stat buf;
    char *ptr;
    for(i=1; i< argc; i++)
    {
      printf("%s: ", argv[i]);
      if(lstat(argv[i],&buf)<0)
      {
  printf("lstat error.");
  continue;
      }
      if(S_ISREG(buf.st_mode)) ptr = "regular";
      else if(S_ISDIR(buf.st_mode)) ptr = "directory";
      else if(S_ISCHR(buf.st_mode)) ptr = "char special";
      else if(S_ISBLK(buf.st_mode)) ptr = "block special";
      else if(S_ISFIFO(buf.st_mode)) ptr = "fifo";
      else ptr = "Others";
      printf(" %s\n",ptr );
    }
    return 0;
  }

  编译程序后,我们先来使用命令mkfifo myfifo.pipe建一个管道文件,然后运行:
filetype myfifo.pipe . /etc/passwd
屏幕会显示:
myfifo.pipe : fifo
 . : directory
 /etc/passwd : regular

  此外,st_mode属性还包含了可用于对文件的属主及权限进行判断的宏,如下表所示:

宏 意义
S_IRUSR 所有者-读
S_IWUSR 所有者-写
S_IXUSR 所有者-执行
S_IRGRP 组-读
S_IWGRP 组-写
S_IXGRP 组-执行
S_IROTH 其他-读
S_IWOTH 其他-写
S_IXOTH 其他-执行


  [程序7]

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
using namespace std;
int main()
{
cout << " enter a file name: ";
char name[255];
cin >> name;
struct stat buf;
if(lstat(name,&buf)<0)
{
cout << " file not existing. " << endl;
return -1;
}
if(buf.st_mode & S_IRUSR) cout << " user can read|";
if(buf.st_mode & S_IWUSR) cout << " user can write|";
if(buf.st_mode & S_IXUSR) cout << " user can execute|";

if(buf.st_mode & S_IRGRP) cout << " group can read|";
if(buf.st_mode & S_IWGRP) cout << " group can write|";
if(buf.st_mode & S_IXGRP) cout << " group can execute|";

if(buf.st_mode & S_IROTH) cout << " other can read|";
if(buf.st_mode & S_IWOTH) cout << " other can write|";
if(buf.st_mode & S_IXOTH) cout << " ohter can execute|";
cout << endl;
return 0;
}

如果是想判断某用户对某一文件的访问权限,则可调用access()函数,它的定义是:
access(const char* path, int amode)
其中,amode对应的值有R_OK(可读)、W_OK(可写)、X_OK(可执行)、F_OK(文件存在)。
jixingzhong 2007-07-12
  • 打赏
  • 举报
回复
【Ref: http://developer.51cto.com/art/200511/10951.htm】

在VC++下对文件属性的获取与更改
作者: 出处:51cto.com整理  ( 7 ) 砖 ( 5 ) 好 评论 ( 0 ) 条  进入论坛
更新时间:2005-11-08 11:01
关 键 词:C
阅读提示:本文讲述了在Visual C++ 下编程实现对磁盘文件的属性进行获取以及更改的一般方法,并给出部分相关的关键代码
一、 引言

文件是数据在磁盘上最常用的一种存放形式,也是在程序设计中与之经常打交道的一种编程对象,不少程序尤其是数据传输和处理类的应用程序更是需要频繁的创建、读取和写入文件。对于一些要求不是很严格的程序,我们往往只关心文件的内容是否正确、文件大小是否有增减或是再严格一些,看文件名是否符合规定等等。以上这些要素对于大多数程序而言显然是可以满足实际需求的,但对于某些特殊行业的一些有着比较严格要求的软件系统,仅有以上要素还是远远不够的,往往还需要对文件的所有属性诸如文件的创建时间、文件的最后访问时间、文件的最后修改时间等等进行提取处理与重新设置。

二、 WIN32_FIND_DATA结构

关于文件的全部属性信息,总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。

在用findfirst()和findnext()函数去查找磁盘文件时经常使用的一个数据结构WIN32_FIND_DATA的成员变量里包含了以上所有的文件属性,因此可以通过这个结构作为获取和更改文件属性的手段。该结构的内容如下:

typedef struct _WIN32_FIND_DATA {

DWORD dwFileAttributes; //文件属性

FILETIME ftCreationTime; // 文件创建时间

FILETIME ftLastAccessTime; // 文件最后一次访问时间

FILETIME ftLastWriteTime; // 文件最后一次修改时间

DWORD nFileSizeHigh; // 文件长度高32位

DWORD nFileSizeLow; // 文件长度低32位

DWORD dwReserved0; // 系统保留

DWORD dwReserved1; // 系统保留

TCHAR cFileName[ MAX_PATH ]; // 长文件名

TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名

} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:

WIN32_FIND_DATA ffd ;

HANDLE hFind = FindFirstFile("c:\\test.dat",&ffd);

在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作为一个只读数据,其所有的成员变量都会由系统完成填写。在MSDN帮助中可以查找到关于WIN32_FIND_DATA结构的更加详细的说明。

三、 文件属性信息的获取与更改

为了更好的保存获取到的文件属性信息,对应于文件属性构造一个自定义的FILE_INFO数据结构,获取的属性信息可暂存于此:

typedef struct _FILE_INFO {

TCHAR szFileTitle[128]; //文件的标题名

DWORD dwFileAttributes; //文件的属性

FILETIME ftCreationTime; //文件的创建时间

FILETIME ftLastAccessTime; //文件的最后访问时间

FILETIME ftLastWriteTime; //文件的最后修改时间

DWORD nFileSizeHigh; //文件大小的高位双字

DWORD nFileSizeLow; //文件大小的低位双字

DWORD dwReserved0; //保留,为0

DWORD dwReserved1; //保留,为0

} FILE_INFO, * PFILE_INFO;

首先用FindFirstFile()函数将文件属性获取到WIN32_FIND_DATA 结构对象FindFileData中去,之后可以用FindClose()将其关闭,并把FindFileData中的有关文件属性信息的内容复制到自定义结构FILE_INFO的结构对象FileInfo中备用。下面是关于这部分描述的部分关键代码:

//声明结构对象

FILE_INFO FileInfo;

WIN32_FIND_DATA FindFileData;

……

//获取文件属性信息

FindClose(FindFirstFile("Test.txt",&FindFileData));

memset(&FileInfo,0,sizeof(FILE_INFO));

……

//将文件属性信息保存到FileInfo中备用

strcpy(FileInfo.szFileTitle,myFile.GetFileTitle());

FileInfo.dwFileAttributes = FindFileData.dwFileAttributes;

FileInfo.ftCreationTime = FindFileData.ftCreationTime;

FileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;

FileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;

FileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;

FileInfo.nFileSizeLow = FindFileData.nFileSizeLow;

……

在获取到文件的原始属性信息后既可以原封不动的将属性重新写到文件,也可以对其中某一项或某几项属性内容进行修改后再行写入文件,从而达到更改文件属性的目的。比如可以用SetFileTime()函数设置文件的创建时间、最近一次访问时间以及最近一次修改的时间等等:

SetFileTime((HANDLE)destFile.m_hFile, //待写入的文件句柄

&FileInfo.ftCreationTime, //文件的创建时间

&FileInfo.ftLastAccessTime, //文件最近一次的访问时间

&FileInfo.ftLastWriteTime); //文件最近一次的修改时间

也可以用SetFileAttributes() 函数实现对文件属性的修改:

SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes);

至于文件名的修改则更加简单,直接在创建文件时在CreateFile()或CFile类的成员函数Open里直接对文件名参数进行设置即可。

小结:本文通过对WIN32_FIND_DATA结构和SetFileTime()、SetFileAttributes()等主要函数实现了对磁盘文件的相关属性信息的获取与修改。用此技术可以在通讯等对文件有严格要求的应用领域实现文件全部信息(包括文件内容、文件名以及文件属性等)的完整传送。本文所述程序在Windows 98下由Microsoft Visual C++ 6.0编译调试通过。
星羽 2007-07-12
  • 打赏
  • 举报
回复
这样也可以

win32_find_data filestruct;
handle hf;
hf = findfirstfile(文件名.c_str(), &filestruct);

filestruct.ftcreationtime//创建时间
filestruct.ftlastaccesstime//访问时间
filestruct.ftlastwritetime//修改时间

findclose(hf);
jixingzhong 2007-07-12
  • 打赏
  • 举报
回复
通常使用 win API 是比较合适的【在win系统下】
jixingzhong 2007-07-12
  • 打赏
  • 举报
回复
函数名: stat
功 能: 读取打开文件信息
用 法: int stat(char *pathname, struct stat *buff);
程序例:

#include <sys\stat.h>
#include <stdio.h>
#include <time.h>

#define FILENAME "TEST.$$$"

int main(void)
{
struct stat statbuf;
FILE *stream;

/* open a file for update */
if ((stream = fopen(FILENAME, "w+")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return(1);
}

/* get information about the file */
stat(FILENAME, &statbuf);

fclose(stream);

/* display the information returned */
if (statbuf.st_mode & S_IFCHR)
printf("Handle refers to a device.\n");
if (statbuf.st_mode & S_IFREG)
printf("Handle refers to an ordinary file.\n");
if (statbuf.st_mode & S_IREAD)
printf("User has read permission on file.\n");
if (statbuf.st_mode & S_IWRITE)
printf("User has write permission on file.\n");

printf("Drive letter of file: %c\n", 'A'+statbuf.st_dev);
printf("Size of file in bytes: %ld\n", statbuf.st_size);
printf("Time file last opened: %s\n", ctime(&statbuf.st_ctime));
return 0;
}
星羽 2007-07-12
  • 打赏
  • 举报
回复
GetFileAttribute
我啃 2007-07-12
  • 打赏
  • 举报
回复
C和C++的都有还有MFC的~
nevergone 2007-07-12
  • 打赏
  • 举报
回复
GetFileAttributes
我啃 2007-07-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20021127/11/1209086.html
http://topic.csdn.net/t/20020613/19/801649.html
http://topic.csdn.net/t/20020918/09/1032607.html

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧