[100]如何更改文件的建立时间,修改时间和存取时间?

Waiting4you 2005-11-09 05:11:38
如何更改资源管理器的文件属性里的建立时间[30分],修改时间[10分]和存取时间[30分]?

还有如何改变文件属性,比如去掉只读属性[30分]?

...全文
4735 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Waiting4you 2005-11-10
  • 打赏
  • 举报
回复
谢谢众兄弟们:-)
kwokwinglau 2005-11-10
  • 打赏
  • 举报
回复
跑过.
constantine 2005-11-10
  • 打赏
  • 举报
回复
已阅
ccrun.com 2005-11-09
  • 打赏
  • 举报
回复
设置文件的属性:

String strFileName("C:\\ccrun\\123.txt");

DWORD dwFileAttr = GetFileAttributes(strFileName.c_str());
// 取消文件的只读,系统属性
dwFileAttr &= ~FILE_ATTRIBUTE_READONLY;
dwFileAttr &= ~FILE_ATTRIBUTE_SYSTEM;
SetFileAttributes(strFileName.c_str(), dwFileAttr);
ccrun.com 2005-11-09
  • 打赏
  • 举报
回复
// 修改指定文件的创建时间,最后访问时间,最后修改时间
// lpFileName: 文件名
// dtCreate: 文件的创建时间
// dtLastAccess: 文件的最后访问时间
// dtLastWrite: 文件的最后修改时间
// 不修改的项,请置为NULL
//---------------------------------------------------------------------------
bool __fastcall MySetFileDateTime(LPSTR lpFileName, TDateTime dtCreate,
TDateTime dtLastAccess, TDateTime dtLastWrite)
{
int nFileHandle;
bool bCreate(false), bLastAccess(false), bLastWrite(false);
TFileTime ftCreate, ftLastAccess, ftLastWrite;
TFileTime ftLocalCreate, ftLocalLastAccess, ftLocalLastWrite;
TSystemTime stLocalCreate, stLocalLastAccess, stLocalLastWrite;

if((double)dtCreate)
{
DecodeDate(dtCreate, stLocalCreate.wYear,
stLocalCreate.wMonth, stLocalCreate.wDay);
DecodeTime(dtCreate, stLocalCreate.wHour, stLocalCreate.wMinute,
stLocalCreate.wSecond, stLocalCreate.wMilliseconds);
bCreate = true;
}
if((double)dtLastAccess)
{
DecodeDate(dtLastAccess, stLocalLastAccess.wYear,
stLocalLastAccess.wMonth, stLocalLastAccess.wDay);
DecodeTime(dtLastAccess, stLocalLastAccess.wHour, stLocalLastAccess.wMinute,
stLocalLastAccess.wSecond, stLocalLastAccess.wMilliseconds);
bLastAccess = true;
}
if((double)dtLastWrite)
{
DecodeDate(dtLastWrite, stLocalLastWrite.wYear,
stLocalLastWrite.wMonth, stLocalLastWrite.wDay);
DecodeTime(dtLastWrite, stLocalLastWrite.wHour, stLocalLastWrite.wMinute,
stLocalLastWrite.wSecond, stLocalLastWrite.wMilliseconds);
bLastWrite = true;
}

bool bResult(false);

try
{
SystemTimeToFileTime(&stLocalCreate, &ftLocalCreate);
SystemTimeToFileTime(&stLocalLastAccess, &ftLocalLastAccess);
SystemTimeToFileTime(&stLocalLastWrite, &ftLocalLastWrite);

LocalFileTimeToFileTime(&ftLocalCreate, &ftCreate);
LocalFileTimeToFileTime(&ftLocalLastAccess, &ftLastAccess);
LocalFileTimeToFileTime(&ftLocalLastWrite, &ftLastWrite);

nFileHandle = FileOpen(lpFileName, fmOpenReadWrite | fmShareExclusive);
if(nFileHandle != -1)
{
bResult = SetFileTime((HANDLE)nFileHandle,
(bCreate? &ftCreate: NULL),
(bLastAccess? &ftLastAccess: NULL),
(bLastWrite? &ftLastWrite: NULL));
// 上一步是否操作成功
ShowMessage(SysErrorMessage(GetLastError()));
}
}
__finally
{
FileClose(nFileHandle);
}
return bResult;
}
// 使用举例:
// 将C:\ccrun\1234.txt文件的最后修改时间改成1999年1月1日
MySetFileDateTime("C:\\ccrun\\1234.txt", NULL, NULL, TDateTime(1999, 1, 1));
// 将C:\ccrun\123.txt文件的创建时间,最后访问时间和最后修改时间改成1999年1月1日
MySetFileDateTime("C:\\ccrun\\1234.txt", TDateTime(1999, 1, 1), TDateTime(1999, 1, 1), TDateTime(1999, 1, 1));


flowercity 2005-11-09
  • 打赏
  • 举报
回复
收藏
weill 2005-11-09
  • 打赏
  • 举报
回复
受教,收下。
shadowstar 2005-11-09
  • 打赏
  • 举报
回复
二、编码实现
1、首先建立一个基于对话框的工程,在对话框窗体中放置以下控制并通过类管理向导为这些控制添加适当变量:

文件名编辑框,输入要改变的文件的全路径,文件名中可以有通配符*和?。
变量类型CString,名称m_FILENAME;
修改包括子目录文件的检查框,变量类型BOOL,名称m_DIRECTORY;
修改文件访问时间检查框,变量类型BOOL,名称m_ACCESS;
文件访问时间日编辑框,变量类型BOOL,名称m_ADAY;
文件访问时间月编辑框,变量类型BOOL,名称m_AMONTH;
文件访问时间年编辑框,变量类型BOOL,名称m_AYEAR;
修改文件产生时间检查框,变量类型BOOL,名称m_CREATE;
文件产生时间日编辑框,变量类型BOOL,名称m_CDAY;
文件产生时间时编辑框,变量类型BOOL,名称m_CHOUR;
文件产生时间分编辑框,变量类型BOOL,名称m_CMINUTE;
文件产生时间月编辑框,变量类型BOOL,名称m_CMONTH;
文件产生时间秒编辑框,变量类型BOOL,名称m_CSECOND;
文件产生时间年编辑框,变量类型BOOL,名称m_CYEAR;
修改文件修改时间检查框,变量类型BOOL,名称m_MODIFY;
文件修改时间日编辑框,变量类型BOOL,名称m_MDAY;
文件修改时间时编辑框,变量类型BOOL,名称m_MHOUR;
文件修改时间分编辑框,变量类型BOOL,名称m_MMINUTE;
文件修改时间月编辑框,变量类型BOOL,名称m_MMONTH;
文件修改时间秒编辑框,变量类型BOOL,名称m_MSECOND;
文件修改时间年编辑框,变量类型BOOL,名称m_MYEAR;
修改文件属性检查框,变量类型BOOL,名称m_PROPERTY;
文件隐藏属性检查框,变量类型BOOL,名称m_HIDE;
文件只读属性检查框,变量类型BOOL,名称m_READ;
文件存档属性检查框,变量类型BOOL,名称m_SAVE;
文件系统属性检查框,变量类型BOOL,名称m_SYSTEM;
执行更改的按钮,点击该按钮后执行选定的更改操作。
以上成员变量可在对话类的构造函数中用当前系统时间予以初始化。

2、在对话类中加入以下成员:

char filter[16];
int ChangeTheProperty
(LPSTR Filename,BYTE bFlag=0) ;
其中成员变量filter用以存放带通配符的文件名。
成员函数ChangeTheProperty中实
现了带通配符的文件的属性的改变,考虑到要遍历子目录,该函数采用了递归调用,并请注意参数bFlag,其缺省值为0,1表示调用发生自子目录。其实现如下:
int CChangePropertyDlg::Change
TheProperty(LPSTR FileName,BYTE bFlag)
{
////存放路径
char pathname[MAX_PATH];
////存放全路径文件名
char allname[MAX_PATH];
////初始化pathname
int num=strlen(FileName);
for(int i=num-1;i>=0;i--){
if(FileName[i]=='\\')
break;
}
if(i==-1)
return 0;
strncpy(pathname,FileName,i+1);
pathname[i+1]='\0';
////查找并修改所有子目录下符合条件的文件
DWORD stat=0;
WIN32_FIND_DATA fileinfo;
if(bFlag){
char DFileName[MAX_PATH];
strcpy(DFileName,pathname);
strcat(DFileName,"*.*");
HANDLE handle=FindFirstFile
(DFileName, &fileinfo);
if(handle==INVALID_HANDLE_VALUE)
return 0;
do{
if(fileinfo.cFileName[0]=='.')
continue;
strcpy(allname,pathname);
strcat(allname,fileinfo.cFileName);
//检取文件属性,可以使用
fileinfo的dwFileAttributes成员
stat=GetFileAttributes(allname);
if(stat==0xffffffff){
MessageBox("警告,获取文件信息时出错!!",
allname, MB_OK|MB_ICONINFORMATION);
continue;
}
//如果查询到的是文件夹
if(stat&FILE_ATTRIBUTE_
DIRECTORY && m_DIRECTORY){
char temp[MAX_PATH];
sprintf(temp,"%s%s\\%s",
pathname,
fileinfo.cFileName,filter);
//递归改变该子目录下的文件
ChangeTheProperty(temp,1);
}
}while(FindNextFile
(handle, &fileinfo));
FindClose(handle);
}
////查找并修改符合条件的文件和文件夹
HANDLE handle=FindFirstFile
( FileName, &fileinfo );
if(handle==INVALID_HANDLE_VALUE)
return 0;
do{
if(fileinfo.cFileName[0]=='.')
continue;
strcpy(allname,pathname);
strcat(allname,fileinfo.cFileName);
//检取文件属性
stat=GetFileAttributes(allname);
if(stat==0xffffffff){
MessageBox("警告,
获取文件信息时出 错!!",
allname,MB_OK|MB_
ICONINFORMATION);
continue;
}
//设置文件属性
BOOL tt=SetFileAttributes(allname,0);
if(!tt){
MessageBox("警告,
文件信息出错!!",
allname,MB_OK|MB_
ICONINFORMATION);
continue;
}
HANDLE hd=CreateFile(allname,
GENERIC_WRITE, FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,NULL);
if(hd!=INVALID_HANDLE_VALUE){
SYSTEMTIME st[3];
GetLocalTime(&st[0]);
st[1]=st[0];st[2]=st[0];
FILETIME ft[3];
FILETIME lft[3];
BYTE ff[3];
ff[0]=0;ff[1]=0;ff[2]=0;
//改变文件访问时间
if(m_ACCESS){
ff[0]=1;
st[0].wDay =m_ADAY;st[0].
wMonth=m_AMONTH;
st[0].wYear=m_AYEAR;
BOOL bb=SystemTime
ToFileTime(&st[0],&ft[0]);
bb=LocalFileTime
oFileTime(&ft[0],&lft[0]);
}
//改变文件产生时间
if(m_CREATE){
ff[1]=1;
st[1].wDay=m_CDAY;st[1].
wHour=m_CHOUR;st[1].
wMinute=m_CMINUTE;
st[1].wMonth=m_
CMONTH;st[1].
wSecond=m_CSECOND;
st[1].wYear=m_CYEAR;
BOOL bb=SystemTime
ToFileTime(&st[1],&ft[1]);
bb=LocalFileTime
ToFileTime(&ft[1],&lft[1]);
}
//改变文件修改时间
if(m_MODIFY){
ff[2]=1;
st[2].wDay=m_MDAY;st[2].
wHour=m_MHOUR;st[2].
wMinute=m_MMINUTE;
st[2].wMonth=m_MMONTH
;st[2].
wSecond=m_MSECOND;
st[2].wYear=m_MYEAR;
BOOL bb=System
TimeToFileTime(&st[2],&ft[2]);
bb=LocalFileTime
ToFileTime(&ft[2],&lft[2]);
}
//改变文件时间
BOOL tt=SetFile
Time(hd,ff[1]?&lft[1]:
NULL,ff[0]?&lft[0]:
NULL,ff[2]?&lft[2]:NULL);
if(!tt){
MessageBox("警告,文件信息出错!!",
allname,MB_OK|MB_ICONINFORMATION);
}
CloseHandle(hd);
}
//改变文件属性
if(m_PROPERTY){
if(m_HIDE)
stat|=FILE_
ATTRIBUTE_HIDDEN;
else
stat&=~FILE_
ATTRIBUTE_HIDDEN;
if(m_READ)
stat|=FILE_
ATTRIBUTE_READONLY;
else
stat&=~FILE_
ATTRIBUTE_READONLY;
if(m_SAVE)
stat|=FILE_
ATTRIBUTE_ARCHIVE;
else
stat&=~FILE_
ATTRIBUTE_ARCHIVE;
if(m_SYSTEM)
stat|=FILE_
ATTRIBUTE_SYSTEM;
else
stat&=~FILE_
ATTRIBUTE_SYSTEM;
}
//设置文件属性
tt=SetFileAttributes(allname,stat);
if(!tt){
MessageBox("警告,
文件信息出错!!",allname,
MB_OK|MB_
ICONINFORMATION);
continue;
}
//查找并修改当前目录
下所有符合条件的文件
if(stat&FILE_
ATTRIBUTE_DIRECTORY
&& !bFlag){//m_DIRECTORY
char temp[128];
sprintf(temp,"%s%s\\%s",
pathname,fileinfo.cFileName,filter);
//递归改变该子目录下的文件
ChangeTheProperty(temp,1);
continue;
}
}while(FindNextFile( handle, &fileinfo ));
FindClose(handle);
return 1;
}

3、在执行更改的按钮的BN_CLICKED消息处理器中加入以下代码,这段代码
首先解析了输入的文件名全路径,并初始化了filter成员变量:
UpdateData(TRUE);
int num=m_FILENAME.GetLength();
for(int i=num-1;i>=0;i--){
if(m_FILENAME.GetAt(i)=='\\')
break;
}
if(i!=-1){
CString ss=m_FILENAME.Right( num-1-i );
strcpy(filter,ss.GetBuffer(15) );
ss.ReleaseBuffer();
ChangeTheProperty
( m_FILENAME.GetBuffer(128)) ;
m_FILENAME.ReleaseBuffer();
}

4、编译连接后,在文件名编辑框中输入要改变的文件的带通配符的全路径,
设置文件的创建修改访问时间以及只读隐藏等属性,点击该按钮后执行选定的更
改操作。
三、本编码在NT4.0平台,用VC++6.0编译,效果良好,符合预期。









原作者:情剑书生
来 源:情剑.net
共有253位读者阅读过此文
shadowstar 2005-11-09
  • 打赏
  • 举报
回复
用Visual C++实现改变指定的文件和文件夹的属性



摘要: 文件的属性包括文件的产生修改和访问时间以及读写隐现等,在DOS下文件的属性可以用DOS命令加以修改,在WINDOWS下,可以通过右键的属性改变一
组文件和文件夹的读写属性,但是却不能修改文件的产生修改和访问时间,并
且不能修改子目录下的文件和文件夹的属性。本文基于Windows的API设计了通
用的文件和文件夹的属性(包括文件的产生修改和访问时间以及读写隐现等)
的修改方法,并实现了其Visual C++程序编码。
关键词:文件,文件夹,读写,属性,产生时间,修改时间,访问时间

文件的属性的修改具有广泛的使用价值,修改文件的读写隐现等属性,
可以实现文件的保护和控制,尤其是修改文件的产生修改和访问时间,可以避
免因防病毒更改系统时间而造成的文件修改时间的紊乱所形成的不便,例如,
对程序员来说,编译时,系统有可能又重新编译那些修改时间紊乱的文件,造
成不必要的麻烦。

一、应用的API函数

1、API中的文件函数组提供了文件读写、属性设置的众多API函数,在本
编码中用到的该函数组中的函数有:

HANDLE CreateFile( LPCTSTR, DWORD,
\DWORD,LPSECURITY_ATTRIBUTES,
DWORD,DWORD,HANDLE );

该函数产生或者打开一个系统对象,并返回一个用以访问该对象的句柄,这些对象可以是文件、文件夹、管道等。
HANDLE FindFirstFile
( LPCTSTR, LPWIN32_FIND_DATA );
该函数在指定目录寻找与指定文件名匹配的文件和文件夹,并返回一个查询句柄。
BOOL FindNextFile
( HANDLE,
LPWIN32_FIND_DATA );
该函数继续一个由查询句柄指定的查询过程。
BOOL FindClose( HANDLE );
该函数关闭指定的查询句柄,结束指定的查询。
DWORD GetFileAttributes
( LPCTSTR );
该函数检取指定的文件的属性信息。
BOOL SetFileAttributes
( LPCTSTR,DWORD );
该函数设置指定的文件的属性信息。

2、API中的时间函数组提供了有关时间转换的众多API函数,在本编码中用到的该函数组中的函数有:
BOOL SystemTimeToFileTime
( CONST SYSTEMTIME *,LPFILETIME );
该函数将系统时间转换成文件时间,文件时间是一个64位长度的数,表示从1601年1月1日起的时间偏移,以千万分之一秒为单位。
BOOL LocalFileTime
ToFileTime(
CONST FILETIME *,LPFILETIME );
该函数将本时区的文件时间转换成格林威治时间的文件时间。
BOOL SetFileTime
( HANDLE,CONST FILETIME
*,CONST FILETIME *,
CONST FILETIME * );
该函数设置文件产生修改和访问的时间。

什么是数据仓库呢?数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据,借助数据仓库的分析能力,企业可从数据中获得宝贵的信息进而改进决策。同时,随着时间的推移,数据仓库中积累的大量历史数据对于数据科学家和业务分析师也是十分宝贵的。 数据仓库建模的意义是什么呢?如果把数据看作图书馆里的书,我们希望看到它们在书架上分门别类地放置;如果把数据看作城市的建筑,我们希望城市规划布局合理;如果把数据看作电脑文件文件夹,我们希望按照自己的习惯有很好的文件夹组织方式,而不是糟糕混乱的桌面,经常为找一个文件而不知所措。数据模型就是数据组织和存储方法,它强调从业务、数据存取和使用角度合理存储数据。只有将数据有序的组织和存储起来之后,数据才能得到高性能、低成本、高效率、高质量的使用。 数据仓库建模的最终目的是什么呢?高性能:良好的数据模型能够帮助我们快速查询所需要的数据。低成本:良好的数据模型能减少重复计算,实现计算结果的复用,降低计算成本。高效率:良好的数据模型能极大的改善用户使用数据的体验,提高使用数据的效率。高质量:良好的数据模型能改善数据统计口径的混乱,减少计算错误的可能性。 本课程将基于理论和实践讲解数据仓库,包含基础知识:数据仓库建模方法论、数据仓库分层模型、数据仓库构建流程、事实表、维度表、指标体系、拉链表、维度模型等 ,基于真实电商业务作为实战,讲解电商数仓的整个构建过程,让大家在实战中理解和掌握数仓的理论知识。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧