查看: 673|回复: 0

[原创图文] windows API学习,获取文件属性 获取Windows目录名 创建文件读取

[复制链接]

35

主题

47

帖子

3

精华

解密专家

Rank: 16

学币
380
荣耀
0
rank
0
违规
0
发表于 2021-2-28 18:31:46 | 显示全部楼层 |阅读模式
本帖最后由 鸦领主 于 2021-3-4 19:41 编辑

1.获取文件属性
GetFileAttributesEx:读取指定文件或目录的属性
GetFileAttributesEx(
  LPCSTR                 lpFileName,
  GET_FILEEX_INFO_LEVELS fInfoLevelId,
  LPVOID                 lpFileInformation
)
lpFileName--要读取的文件或目录
fInfoLevelId--GetFileExInfoStandard
lpFileInformation--//指向接收属性信息的缓冲区的指针(这里是读取到WIN32_FILE_ATTRIBUTE_DATA结构体里面)


FileTimeToLocalFileTime:将世界文件时间(FILETIME结构)转换成本地(FILETIME结构)文件时间的
BOOL FileTimeToLocalFileTime(
    const FILETIME* lpFileTime,
    LPFILETIME     lpLocalFileTime
);
lpFileTime--要转换为本地文件时间的FILETIME结构体对象
lpLocalFileTime--接收转换后的FILETIME结构体对象


FileTimeToSystemTime:将本地文件时间转换为本地系统时间
BOOL FileTimeToSystemTime(
    const FILETIME* lpFileTime,
    LPSYSTEMTIME   lpSystemTime
);
lpFileTime--要转换为本地系统时间的FILETIME结构体对象
lpSystemTime--接收转换后的SYSTEMTIME结构体对象

#include<iostream>
#include<windows.h>
using namespace std;
void  SetAttribute(LPCTSTR Path)
{
    DWORD AttributeHandle = GetFileAttributes(Path);
    AttributeHandle |= FILE_ATTRIBUTE_READONLY;//赋值只读属性
    AttributeHandle |= FILE_ATTRIBUTE_COMPRESSED;//赋值压缩属于
    SetFileAttributes(Path, AttributeHandle);//设置文件属性
}

VOID ShowFileTime(FILETIME &wfad)
{
    //SYSTEMTIME结构体包含年月日时分秒等成员
    SYSTEMTIME sys;//保存第二次转换后的系统时间
    FILETIME file;    //保存第一次转换后的本地时间
    FileTimeToLocalFileTime(&wfad, &file);//第一次转换 :将 世界文件时间 转换成 本地文件时间
    FileTimeToSystemTime(&file, &sys);//第二次转换 :将 本地文件时间 转换成 本地系统时间
    printf("%d年%#02d月%#02d日,%#02d:%#02d:%#02d\n",
        sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond);
}
int main()
{
    //WIN32_FILE_ATTRIBUTE_DATA结构体包含
    WIN32_FILE_ATTRIBUTE_DATA wfad;
    GetFileAttributesEx(L"yyds.txt", GetFileExInfoStandard, &wfad);
    cout << "文件创建时间:";
    ShowFileTime(wfad.ftCreationTime); //ftCreationTime文件创建时间
    cout << "文件修改时间:";
    ShowFileTime(wfad.ftLastAccessTime);//ftLastAccessTime文件修改时间
    cout << "文件访问时间:";
    ShowFileTime(wfad.ftLastWriteTime);//ftLastWriteTime文件访问时间


windows API学习,获取文件属性

windows API学习,获取文件属性


GetFileAttributes:获取指定文件属性
DWORD GetFileAttributesA(
        LPCSTR lpFileName//要获取属性的文件的名称
    );
成功返回文件属性,失败返回INVALID_FILE_ATTRIBUTES<span style="box-sizing: inherit; font-weight: 600; outline-color: inherit; color: rgb(23, 23, 23); font-family: "Segoe UI", SegoeUI, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"></span>

SetFileAttributes:为文件或目录设置属性。

BOOL SetFileAttributesA(
    LPCSTR lpFileName,//要设置属性的文件的名称。
    DWORD  dwFileAttributes//要为文件设置的文件属性
);
成功返回非0,失败返回0


2.获取Windows目录名
GetSystemDirectory:获取Windows目录名路径
UINT WINAPI GetSystemDirectory(
     LPTSTR lpBuffer,
     UINT uSize)
lpBuffer--存放获取到的路径的缓冲区
uSize--lpBuffer字串的最大长度
    CHAR Buffer[MAX_PATH];//MAX_PATH表示260,路径长度一般最大就是260
    GetSystemDirectory(Buffer, MAX_PATH);
    cout << Buffer;

windows API学习,获取文件属性 获取Windows目录名 创建文件读取

windows API学习,获取文件属性 获取Windows目录名 创建文件读取


3.创建文件,读取,写入
CreateFile:这是一个多功能的函数,可打开或创建文件或者I/O设备,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
HANDLE CreateFileA(
    LPCSTR                lpFileName,
    DWORD                 dwDesiredAccess,
    DWORD                 dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD                 dwCreationDisposition,
    DWORD                 dwFlagsAndAttributes,
    HANDLE                hTemplateFile
);
lpFileName--要创建或打开的文件或设备的名称
dwDesiredAccess--对文件或设备所请求的访问权限,可概括为读、写或都有(GENERIC_READ、GENERIC_WRITE、GENERIC_READ| GENERIC_WRITE)
dwShareMode--共享模式(如果是0表示不共享)
lpSecurityAttributes--指向安全属性的指针(一般填入NULL,默认安全属性)
dwCreationDisposition--指定当文件存在或不存在时的操作。常见的操作有5种:

    CREATE_NEW:创建文件,如果文件存在会出错;
    CREATE_ALWAYS:创建文件,会修改前一个文件;
    OPEN_EXISTING:文件已经存在;
    OPEN_ALWAYS:如果不存在就创建;
    TRUNCATE_EXISTING:将现有的文件缩短为零长度;

dwFlagsAndAttributes--表示新创建文件的属性。文件的常见属性有5种:

    FILE_ATTRIBUTE_ARCHIVE:标记为归档属性;
    FILE_ATTRIBUTE_NORMAL:默认属性;
    FILE_ATTRIBUTE_HIDDEN:隐藏文件或目录;
    FILE_ATTRIBUTE_READONLY:文件为只读;
    FILE_ATTRIBUTE_SYSTEM:文件为系统文件;


hTemplateFile--模板文件的有效句柄(没有模板就填NULL)
如果函数成功,则返回值是指定文件、设备、命名管道或邮件槽的打开句柄。
如果函数失败,返回值为INVALID_HANDLE_VALUE


ReadFile:从指定的文件或输入 / 输出(I / O)设备读取数据
BOOL ReadFile(
    HANDLE       hFile,
    LPVOID       lpBuffer,
    DWORD        nNumberOfBytesToRead,
    LPDWORD      lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
);

hFile--CreateFile返回的句柄

lpBuffer--存放读取出来的数据的缓存区
nNumberOfBytesToRead--每次读取多少字节
lpNumberOfBytesRead--实际读取了多少字节
lpOverlapped--一般就写入NULL
如果函数成功,则返回值为非零(真的)
如果函数失败或正在异步完成,则返回值为零

WriteFile:将数据写入指定的文件或输入 / 输出(I / O)设备
BOOL WriteFile(
    HANDLE       hFile,
    LPCVOID      lpBuffer,
    DWORD        nNumberOfBytesToWrite,
    LPDWORD      lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped
);
hFile--CreateFile返回的句柄
lpBuffer--要写入到文件里面的内容
nNumberOfBytesToWrite--要写入数据的字节数量
lpNumberOfBytesWritten--实际写入的数量
lpOverlapped--一般就写入NULL
如果函数成功,则返回值为非零(真的)
如果函数失败或正在异步完成,则返回值为零

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

论坛公告上一条 /1 下一条

快速回复 返回顶部 返回列表