查看: 123|回复: 0

[原创图文] 时间族函数 文件搜索相关函数

[复制链接]

22

主题

31

帖子

3

精华

高级会员

Rank: 12Rank: 12Rank: 12

学币
251
荣耀
0
rank
0
违规
0
发表于 2021-1-14 15:40:09 | 显示全部楼层 |阅读模式
1.时间族函数

a)time()函数
time()函数返回值的数据类型是time_t__time64_t。传递给time()函数的参数是指向time_t数据类型的指针
用处:返回一个值,即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒。
#include <stdio.h>
#include <time.h>

int main()
{
    time_t t1, t2; //分别声明两种使用方式的赋值对象

    t1 = time(0);   //第一种使用方式
    time(&t2);    //第二种使用方式

    printf("t1=%ld\n", t1);
    printf("t2=%ld", t2);
//打印出来的将是<span style="color:#333333;">1970年1月1日00:00:00到现在的时间,共1610442310秒</span>
    return 0;
}
b)localtime()函数
localtime函数原型:struct tm *localtime(const time_t *timer)
返回值:返回指向tm 结构体的指针.tm结构体是time.h中定义的用于分别存储时间的各个量(年月日等)的结构体.

该函数返回指向 tm 结构的指针,该结构带有被填充的时间信息。下面是 tm 结构的细节:
struct time1
{
    int tm_sec;         // 秒,范围从 0 到 59                
    int tm_min;         // 分,范围从 0 到 59              
    int tm_hour;        // 小时,范围从 0 到 23               
    int tm_mday;        // 一月中的第几天,范围从 1 到 31                  
    int tm_mon;         // 月份,范围从 0 到 11              
    int tm_year;        // 自 1900 起的年数               
    int tm_wday;        // 一周中的第几天,范围从 0 到 6              
    int tm_yday;        // 一年中的第几天,范围从 0 到 365                    
    int tm_isdst;       // 夏令时                        
};
用处:localtime是 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
int main()
{
    time_t t;
    time(&t);
    tm*t1=localtime(&t);//月份+1是因为范围是0-11
    printf("%d.%d.%d(星期%d)", t1->tm_year + 1900, t1->tm_mon + 1, t1->tm_mday,t1->tm_wday);
    return 0; //year+1900是因为他是当前的年数减去1900,如果要显示的正常就要+1900
}

.

.

因为星期几范围是0-6,如果是星期日的话他就是0,可以用指针数组来解决这个问题
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
int main()
{
    time_t t;
    time(&t);
    tm*t1=localtime(&t);
    char* p[] = { "日","一","二","三","四","五","六"};//
    printf("%d.%d.%d(星期%s)", t1->tm_year + 1900, t1->tm_mon + 1, t1->tm_mday,p[t1->tm_wday]);
    return 0;
}

.

.


c)mktime()函数
作用是,将时间转换为自1970年1月1日以来持续时间的秒数,发生错误时返回-1。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
int main()
{
    tm p = { 0,24,18,12,1-1,2021-1900 };//将2021.1.12 18点24分0秒转换为秒
    time_t t =mktime(&p); //1970年1月1日00:00:00到数入的时间,之间的时间转换为秒
    printf("%d秒", t);
    return 0;
}

.

.


2.查找文件想关函数
本次函数用到#include <io.h>
a)_findfirst()函数和_findnext()函数和_findclose()函数


①_findfirst函数原型:long _findfirst(const char *, struct _finddata_t *)
第一个参数为文件名,可以用"*.*"来查找所有文件,也可以用"*.cpp"来查找.cpp文件
第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。

_findfirst 函数返回的是匹配到文件的句柄,数据类型为long
作用:
搜索与指定的文件名称匹配的第一个实例

②_findnext函数原型:int _findnext(long, struct _finddata_t *);

第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1L。
作用:搜索与_findfrist函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1L

③_findclose()函数原型:int _findclose(long);
只有一个参数,文件句柄。若关闭成功返回0,失败返回-1L。
作用:用于释放由FindFirst分配的内存

④_finddata_t结构体详细
struct _finddata32_t
{
    unsigned    attrib;           
    __time32_t  time_create; 
    __time32_t  time_access;   
    __time32_t  time_write;
    _fsize_t    size;
    char        name[260];
};

unsigned    attrib:文件属性的存储位置
_A_ARCH 0x20(存档)、 _A_HIDDEN 0x02(隐藏)
_A_NORMAL 0x00(正常)、_A_RDONLY 0x01(只读)
_A_SUBDIR 0x10(文件夹)、_A_SYSTEM 0x04(系统)
__time32_t  time_create:存储文件创建时间   
__time32_t  time_access:文件最后一次被访问的时间。   
__time32_t  time_write:
文件最后一次被修改的时间。
_fsize_t    size:文件的大小(字节数表示)。
char        name[260]:文件名称

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <io.h>
int main()
{
    _finddata_t file; //定义一个结构体对象
    long handle = _findfirst("C:\\*.*", &file);//定义一个句柄handle,将_findfirst查找的结果赋值给他

    if (handle == -1L) //
    {
        printf(  "查找失败" );
    }
    else
    {
        do
        {
            if (!(file.attrib & _A_HIDDEN))//显示非隐藏文件,将!取下就是显示隐藏文件
                    printf("%s,%d\n", file.name, file.size);//打印文件的名称,大小
        } while (_findnext(handle, &file) == 0);//判断下一个匹配的实列,成功返回1,失败返回0
    }
    _findclose(handle); //关闭句柄
    return 0;
}

.

.


⑤磁盘扫描(递归)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <io.h>
#include<string.h>
void dg(char* sm, char* ss)
{
    _finddata_t file;
    char s[256];
    strcpy(s, sm);//将输入的复制给s
    strcat(s, "\\*.*");//在合并,比如输入的是c:合并后是c:\\*.*
    long handle = _findfirst(s, &file);//搜索c盘下所有的内容
    if (handle == -1L)
    {
        printf("查找失败");
        return;
    }
    do
    {
        if ((strcmp(file.name, ss) == 0))//判断搜索的文件名称是否与输入的名称一样
        {
            puts(s);//打印路径
            printf("%s,%d\n", file.name, file.size);//则打印
            return;
        }
        if (!(file.attrib & _A_HIDDEN))//如果不是隐藏文件
        {
            if ((file.attrib & _A_SUBDIR))//如果 file.attrib & _A_SUBDIR判断文件属性是文件夹
            {
                if (strcmp(file.name, ".") && strcmp(file.name, ".."))//每个文件的前俩个都是.和..为了方便直接判断
                {

                    char r[256];
                    strcpy(r, sm);//将输入的c:给r
                    strcat(r, "\\");// C:\\合并
                    strcat(r, file.name);//在将搜索的第一个文件名称合并 c:\\Action!
                    dg(r, ss);//带入函数继续扫描
                }
            }
        }
    } while (_findnext(handle, &file) == 0);
    _findclose(handle);
}
int main()
{
    char c[256];
    char b[256];
    printf("请输入磁盘");
    scanf("%s", &c);
    printf("请输入名称");
    scanf("%s", &b);
    dg(c, b);
    return 0;
}

.

.

这个失败应该是,没有权限打开某些文件,然后返回了-1L
还有很多地方没有完善

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
微信扫一扫即可使用手机论坛
快速回复 返回顶部 返回列表