背景
在Windows系统下没有提供可以对文件夹时间属性修改的方法或者API,在上一篇文章中我们提到了文件时间的函数,那么我们可以以打开文件的方式打开文件夹,然后通过修改文件时间的API函数对文件夹时间进行访问获取并进行修改。
解决方案
首先,我们介绍一个函数CreateFile:
HANDLE CreateFile(
LPCTSTR lpFileName, // 文件名指针
DWORD dwDesiredAccess, // 访问模式
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全属性
DWORD dwCreationDisposition, // 创建方式
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 指向待复制属性的文件指针
);
当要对文件夹进行操作时,将第一个参数IpFileName设置为文件夹的名称或者路径;将访问模式设置为GENERIC_READ,对于文件夹属性信息的写入需要GENERIC_WRITE的帮助;由于CreateFile函数在进行文件夹操作的时候,不能以创建的方式进行,所以创建方式只能打开已经存在的对象,因此将dwCreationDisposition设置为OPEN_EXITSING;dwFlagsAndAttributes参数的设置是比较重要的,正是通过将该参数设置为FILE_FLAG_BACKUP_SEMANTICS属性才使CreateFile()函数来进行打开文件夹的操作。
实践
我们运行程序,获取一个文件夹的时间属性并对其进行修改 程序运行截图 ,我们右键点开文件夹的属性,来验证程序的正确性: 验证 看来程序是正确的,下面我们就进行修改,选择1: 修改成功程序截图 我们看到程序返回Success成功,那么我们验证一下: 修改时间验证 创建时间修改我们可以看到文件夹的时间属性修改成功!
下面我就分享一下程序源码,大家可以根据自己的情况进行更改,也可以留言提问题哟!
程序源码
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
void print(FILETIME ftime)
{
char str[50];
SYSTEMTIME rtime;
FILETIME ltime;
memset(str,0,50);
FileTimeToLocalFileTime(&ftime,<ime);
FileTimeToSystemTime(<ime,&rtime); //将文件时间转化为系统时间
sprintf(str, "%04u-%02u-%02u %02u:%02u:%02u",rtime.wYear, rtime.wMonth, rtime.wDay, rtime.wHour, rtime.wMinute, rtime.wSecond);
printf("%s\n",str);
}
int main(int argc, char *argv[])
{
printf(argv[1]);
printf("\n");
HANDLE hDir = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if(hDir == INVALID_HANDLE_VALUE)
{
printf("Get the dictionary failed!\n");
CloseHandle(hDir);
return 0;
}
//定义变量
FILETIME IpCreationTime; //文件夹的创建时间
FILETIME IpLastAccessTime; //对文件夹的最近访问时间
FILETIME IpLastWriteTime; //文件夹的最近修改时间
FILETIME ftime;
SYSTEMTIME ktime;
//获取文件夹的时间属性
if(GetFileTime(hDir, &IpCreationTime, &IpLastAccessTime, &IpLastWriteTime))
{
printf("获取文件夹时间成功,如下:\n");
printf("初始创建时间为:\t");
print(IpCreationTime);
printf("最近访问时间为:\t");
print(IpLastAccessTime);
printf("最近修改时间为:\t");
print(IpLastWriteTime);
}
int temp = 0;
printf("\n是否对文件时间进行修改?(1:修改,2:不修改):");
scanf("%d",&temp);
if(temp == 1)
{
//定义一些变量
char year[15],times[15];
SYSTEMTIME kktime;
FILETIME pptime;
memset(year,0,15);
memset(times,0,15);
printf("请输入要修改为何时间(如2019-02-18 08:00:46):");
scanf("%s %s",year,times);
sscanf(year, "%d-%d-%d", &kktime.wYear, &kktime.wMonth, &kktime.wDay);
sscanf(times, "%d:%d:%d", &kktime.wHour, &kktime.wMinute, &kktime.wSecond);
kktime.wDayOfWeek = 1;
kktime.wMilliseconds = 0;
SystemTimeToFileTime(&kktime, &pptime);
//下面我将三个时间全部修改了,小伙伴可以根据自己的情况进行修改
BOOL retval = SetFileTime(hDir, &pptime, &pptime, &pptime);
if(retval == TRUE)
{
printf("Success\n");
}
else
{
printf("Failed\n");
}
}
else
{
printf("再见!\n");
}
CloseHandle(hDir);
return 0;
}
网友评论