使用Windows API获取修改文件属性

50 阅读1分钟

使用的API

Windows API功能
GetFileAttributesEx获取文件属性
SetFileAttributes修改文件属性

测试代码

#include <Windows.h>
#include <stdio.h>

DWORD ShowFileTime(PFILETIME lptime) {
    FILETIME ftLocal;  // 本地时间
    SYSTEMTIME st;    // 系统时间


    // 先转换为本地时间(北京时间)
    FileTimeToLocalFileTime(lptime, &ftLocal);

    // 将本地时间转换为系统时间
    FileTimeToSystemTime(&ftLocal, &st);

    printf("%4d年%#02d月%#02d日 %#02d:%#02d:%#02d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

    return 0;

}

// 显示文件大小
DWORD ShowFileSize(DWORD dwFileSizeHigh, DWORD dwFileSizeLow) {
    ULONGLONG liFileSize;  // 64位的

    liFileSize = dwFileSizeHigh;
    liFileSize <<= 32;  // 左移32,移动到高32位上

    liFileSize += dwFileSizeLow;  // 加上低32位

    printf("文件大小:\t%I64u 字节\n", liFileSize);

    return 0;

}

// 显示文件属性
DWORD ShowFileAttrInfo(DWORD dwAttribute) {
    printf("文件属性:\t");

    if (dwAttribute & FILE_ATTRIBUTE_ARCHIVE) {
        printf("<ARCHIVE>");
    }

    if (dwAttribute & FILE_ATTRIBUTE_COMPRESSED) {
        printf("<COMPRESSED>");
    }

    if (dwAttribute & FILE_ATTRIBUTE_READONLY) {
        printf("<READONLY>");
    }

    return 0;

}

DWORD ShowFileAttributes(LPCTSTR szPath) {
    WIN32_FILE_ATTRIBUTE_DATA wfad;

    printf("文件:%ls\n", szPath);

    // 获取文件属性
    // GetFileExInfoStandard表示获取标准的文件信息
    if (!GetFileAttributesEx(szPath, GetFileExInfoStandard, &wfad)) {
        printf("获取文件属性失败: %d\n", GetLastError());
        return 1;
    }

    printf("创建时间:\t");

    ShowFileTime(&(wfad.ftCreationTime));

    printf("访问时间:\t");

    ShowFileTime(&(wfad.ftLastAccessTime));

    printf("修改时间:\t");

    ShowFileTime(&(wfad.ftLastWriteTime));

    ShowFileSize(wfad.nFileSizeHigh, wfad.nFileSizeLow);  // 将高位和低位合并在一起显示出来文件大小

    ShowFileAttrInfo(wfad.dwFileAttributes);


    return 0;
}

int main() {

    ShowFileAttributes(TEXT("C:\\Users\\win10\\source\\repos\\Project14\\main.cpp"));

    return 0;
}

显示效果

image.png

修改文件属性

代码

#include <Windows.h>
#include <stdio.h>

DWORD SetFileHiddenAndReadOnly(LPCTSTR szFileName) {

    DWORD dwFileAttributes = GetFileAttributes(szFileName);  // 获取文件属性

    dwFileAttributes |= FILE_ATTRIBUTE_READONLY; // 加上只读属性

    dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN;  // 加上隐藏

    if (!SetFileAttributes(szFileName, dwFileAttributes))  // 修改文件属性
    {
        printf("文件属性设置失败");
    }
    else {
        printf("文件属性设置成功");
    }

    return 0;
}

int main() {

    SetFileHiddenAndReadOnly(TEXT("C:\\Users\\win10\\source\\repos\\Project15\\book.txt"));


    return 0;
}

效果

image.png