macOS/iOS 文件属性的获取

前言

在ios获取mac中我们获取文件属性一般是通过使用NSFileManger对象类获取,但是它在访问macOS Big Sur上面,访问桌面或者下载等文件的时候,需要用户授权。所以我尝试使用其底层函数来实现文件属性的获取。

stat函数 获取文件属性

inclue <sys/stat.h>

是unix/linux系统定义文件状态所在的伪标准头文件。

含有类型与函数:

__uint16_t      st_dev;         /* inode's device */
ino_t           st_ino;         /* inode's number */
mode_t          st_mode;        /* inode protection mode */
nlink_t         st_nlink;       /* number of hard links */
__uint16_t      st_uid;         /* user ID of the file's owner */
__uint16_t      st_gid;         /* group ID of the file's group */
__uint16_t      st_rdev;        /* device type */
__int32_t       st_size;        /* file size, in bytes */
struct  timespec st_atimespec;  /* time of last access */
struct  timespec st_mtimespec;  /* time of last data modification */
struct  timespec st_ctimespec;  /* time of last file status change */
__int32_t       st_blksize;     /* optimal blocksize for I/O */
__int32_t       st_blocks;      /* blocks allocated for file */
__uint32_t      st_flags;       /* user defined flags for file */
__uint32_t      st_gen;         /* file generation number */

int     chmod(const char *, mode_t) __DARWIN_ALIAS(chmod);
int     fchmod(int, mode_t) __DARWIN_ALIAS(fchmod);
int     fstat(int, struct stat *) __DARWIN_INODE64(fstat);
int     lstat(const char *, struct stat *) __DARWIN_INODE64(lstat);
int     mkdir(const char *, mode_t);
int     mkfifo(const char *, mode_t);
int     stat(const char *, struct stat *) __DARWIN_INODE64(stat);
int     mknod(const char *, mode_t, dev_t);
mode_t  umask(mode_t);

#if __DARWIN_C_LEVEL >= 200809L
int     fchmodat(int, const char *, mode_t, int) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
int     fstatat(int, const char *, struct stat *, int) __DARWIN_INODE64(fstatat) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
int     mkdirat(int, const char *, mode_t) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
int     futimens(int __fd, const struct timespec __times[2]) __API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0), watchos(4.0));
int     utimensat(int __fd, const char *__path, const struct timespec __times[2],
    int __flag) __API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0), watchos(4.0));
#endif

使用stat函数最多的可能是ls-l命令,用其可以获得有关一个文件的所有信息。

一般头文件在/usr/include下面,这里是标准C程序头文件,如果你的头文件前加了 <sys/*>,那说明这是系统调用函数头文件,其在/usr/include/sys下面。

函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性。函数原型#include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);提供文件名字,获取文件对应属性。
int fstat(int filedes, struct stat *buf);通过文件描述符获取文件对应的属性。
int lstat(const char *restrict pathname, struct stat *restrict buf);连接文件描述命,获取文件属性。
文件对应的属性

struct stat {
    dev_t           st_dev;         /* [XSI] 设备号码 */
    ino_t           st_ino;         /* [XSI] inode节点号 */
    mode_t          st_mode;        /* [XSI] 文件对应的种类:文件,目录等 */
    nlink_t         st_nlink;       /* [XSI] 文件的连接数 */
    uid_t           st_uid;         /* [XSI] 文件所有者 */
    gid_t           st_gid;         /* [XSI] 文件所有者对应的组 */
    dev_t           st_rdev;        /* [XSI] 设备ID */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
    struct  timespec st_atimespec;  /* 文件最后被访问的时间 */
    struct  timespec st_mtimespec;  /* 文件内容最后被修改的时间 */
    struct  timespec st_ctimespec;  /* 文件状态改变时间 */
#else
    time_t          st_atime;       /* [XSI] 文件最后被访问的时间 */
    long            st_atimensec;   /* 最后一次访问的 nsec */
    time_t          st_mtime;       /* [XSI] 文件内容最后被修改的时间 */
    long            st_mtimensec;   /* 文件内容最后被修改的时间 nsec */
    time_t          st_ctime;       /* [XSI] 文件状态改变时间 */
    long            st_ctimensec;   /* 文件状态改变时间 nsec */
#endif
    off_t           st_size;        /* [XSI] 普通文件,对应的文件字节数 */
    blkcnt_t        st_blocks;      /* [XSI] 为文件分配的块 */
    blksize_t       st_blksize;     /* [XSI] 文件内容对应的块大小 */
    __uint32_t      st_flags;       /* user defined flags for file */
    __uint32_t      st_gen;         /* file generation number */
    __int32_t       st_lspare;      /* RESERVED: DO NOT USE! */
    __int64_t       st_qspare[2];   /* RESERVED: DO NOT USE! */
};

示例:

#import <sys/stat.h>
int main() {\
    struct stat buf;
    **stat("/etc/hosts", &buf);
    printf("/etc/hosts file size = %d\n", buf.st_size);
}

通过mdls命令行获取文件属性

 mdls /Users/xxxx/Desktop/文件读取测试/test221.bundle 

_kMDItemDisplayNameWithExtensions      = "test221.bundle"            //文件扩展名
kMDItemContentCreationDate             = 2021-08-30 07:15:22 +0000   //文件内容创建时间
kMDItemContentCreationDate_Ranking     = 2021-08-30 00:00:00 +0000
kMDItemContentModificationDate         = 2021-09-10 07:52:30 +0000   //文件内容修改时间
kMDItemContentModificationDate_Ranking = 2021-09-10 00:00:00 +0000
kMDItemContentType                     = "com.apple.generic-bundle"  //文件内容类型
kMDItemContentTypeTree                 = (
    "com.apple.generic-bundle",
    "com.apple.bundle",
    "public.directory",
    "public.item",
    "com.apple.package"
)
kMDItemDateAdded                       = 2021-09-10 11:26:13 +0000 //文件添加时间
kMDItemDateAdded_Ranking               = 2021-09-10 00:00:00 +0000
kMDItemDisplayName                     = "test221.bundle"
kMDItemDocumentIdentifier              = 0
kMDItemFSContentChangeDate             = 2021-09-10 07:52:30 +0000 //内容修改时间
kMDItemFSCreationDate                  = 2021-08-30 07:15:22 +0000
kMDItemFSCreatorCode                   = ""
kMDItemFSFinderFlags                   = 0
kMDItemFSHasCustomIcon                 = (null)
kMDItemFSInvisible                     = 0=
kMDItemFSIsExtensionHidden             = 0
kMDItemFSIsStationery                  = (null)
kMDItemFSLabel                         = 0
kMDItemFSName                          = "test221.bundle"
kMDItemFSNodeCount                     = 8
kMDItemFSOwnerGroupID                  = 20
kMDItemFSOwnerUserID                   = 501
kMDItemFSSize                          = 278040
kMDItemFSTypeCode                      = ""
kMDItemInterestingDate_Ranking         = 2021-09-10 00:00:00 +0000  //文件种类
kMDItemKind                            = "捆绑包"
kMDItemLogicalSize                     = 278040                     //文件大小 字节
kMDItemPhysicalSize                    = 303104

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容