用VC++编程全面掌控文件属性

在VC++的编程中,如何读取或设置文件的属性呢,经过一番研究,这里总结一下。

1.读取文件属性
使用FindFirstFile函数可以读取文件的各种基本属性,其原形是:

HANDLE FindFirstFile(
LPCTSTR lpFileName,   //这个参数是要读取属性的文件路径
LPWIN32_FIND_DATA lpFindFileData //WIN32_FIND_DATA结构体,用于接收获取到的属性信息。
);

我们可以这样使用它:

WIN32_FIND_DATA _FindFileData;
ZeroMemory(&_FindFileData,sizeof(WIN32_FIND_DATA));
HANDLE hFind=::FindFirstFile(csPath,&_FindFileData);
if (hFind==INVALID_HANDLE_VALUE)
{
 return FALSE;
}

WIN32_FIND_DATA的定义为:

typedef struct _WIN32_FIND_DATA {

//dwFileAttributes是文件的基本属性,用每个位标志不同的属性
//例如用(_FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)==FILE_ATTRIBUTE_HIDDEN
//可以判断文件是否为隐藏文件。
DWORD dwFileAttributes; 

//文件创建时间,可以通过CTime(_FindFileData.ftCreationTime),将其转换为CTime;
FILETIME ftCreationTime; 

//文件最后访问时间
FILETIME ftLastAccessTime; 

//文件最后修改时间
FILETIME ftLastWriteTime; 

//文件的大小是用两个DWORD表示的,其间的算术关系为:(nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow
//可以用这样的方式来计算:
//LONGLONG ret=MAXDWORD;
//ret+=1;
//ret*=_FindFileData.nFileSizeHigh;
//ret+=_FindFileData.nFileSizeLow;
//这个+1单独写出来是因为在32位的机器上MAXDWORD+1的中间结果在一个寄存器中无法表示
DWORD nFileSizeHigh;
DWORD nFileSizeLow; 

//Reserved
DWORD dwReserved0;
DWORD dwReserved1; 

//文件的名称,如果文件在当前文件夹下,则返回的是相对路径
TCHAR cFileName[MAX_PATH]; 

//文件名称的DOS写法(8.3格式以及~1格式),比如Program Files会被写为Progra~1
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

有时候,我们想知道文件的完整路径,那么可以使用GetFullPathName函数。

TCHAR szBuffer[MAX_PATH];
LPTSTR lpFilePart=NULL;
::GetFullPathName(_FindFileData.cFileName,MAX_PATH,szBuffer,&lpFilePart);

执行后SzBuffer中即是文件的全名.

要重命名文件,可以执行

::MoveFile(_FindFileData.cFileName, csNewName);

如果我们要从文件句柄获取文件名,可以参考http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx(Obtaining a File Name From a File Handle)

2.设置文件属性
SetFileAttributes可以设置文件的只读,隐藏,系统等属性。
例如执行:

DWORD dwFileAttributes= GetFileAttributes(lpFileName);
SetFileAttributes(dwFileAttributes | FILE_ATTRIBUTE_SYSTEM);

可以设置文件lpFileName的系统属性。

需要特别注意的是,连续多次调用SetFileAttributes可能会失败,最好将各种属性标志组合好,用SetFileAttributes一次性写入。

SetFileTime可以设置文件的创建时间,修改时间等,原型为:

BOOL SetFileTime(
//文件句柄,可以通过CreateFile得到
HANDLE hFile,

//文件的创建时间
const FILETIME* lpCreationTime,
//最后访问时间
const FILETIME* lpLastAccessTime,
//最后修改时间
const FILETIME* lpLastWriteTime
);

注意时间数据格式之间的转换,比如将CTime转换为FILETIME:

CTime newTime,FILETIME ftCreationTime;

//首先将CTime转换为SYSTEMTIME
SYSTEMTIME st_time;
newTime.GetAsSystemTime(st_time);

//将SYSTEMTIME转换为FILETIME
::SystemTimeToFileTime(&st_time,&ftCreationTime);

//注意本地时间和UTC时间的时差
::LocalFileTimeToFileTime(&ftCreationTime,&ftCreationTime);

3.封装的文件属性操作类CFileAttribute
点击下载FileAttribute.rar

该类使用很简单,根据标识符的字面意思就可以了。

4.文件的权限等属性
请参考文章:以程序的方式操纵NTFS的文件权限
http://haoel.blog.51cto.com/313033/124668
http://www.google.cn/search?sourceid=navclient&hl=zh-CN&ie=UTF-8&rlz=1T4GFRE_zh-CNCN327CN327&q=%e4%bb%a5%e7%a8%8b%e5%ba%8f%e7%9a%84%e6%96%b9%e5%bc%8f%e6%93%8d%e7%ba%b5NTFS%e7%9a%84%e6%96%87%e4%bb%b6%e6%9d%83%e9%99%90

5.文件的附加数据流
参看http://www.qingfengju.com/article.asp?id=65
一个NTFS数据流枚举,附加,删除的类CNtfsStream

6.文件的结构化存储
参看http://www.diybl.com/course/3_program/c++/cppxl/20081118/151932.html

时间: 2024-12-29 04:52:21

用VC++编程全面掌控文件属性的相关文章

【VC编程技巧】控件?4.1位图Button

4.1位图Button 给按钮增加位图,或改变按钮字体,可以让按钮达到跟炫的效果:如何给按钮增加位图,和改变按钮上文字的字体?请看下面示例! 1>创建对话框程序,建立如下对话框: 图1 资源ID说明: 左边按钮ID:IDC_BUTTON1 右边按钮ID:IDCANCEL 2>设置button属性,设置选项如下图箭头处: 图2 3>添加位图到工程,如下图箭头处: 图3 4>给左边按钮添加控件变量(利用类向导); CBitmapButton m_bitmapButton; ※如果类向导

【VC编程技巧】控件?4.4ListBox控件(打造带有复选框的ListBox)

4.4ListBox控件(打造带有复选框的ListBox) 下面通过两种方式构建复选框ListBox 1.对话框中插入ListBox控件(IDC_LIST1,IDC_LIST2),如下设置属性 图1 方式一: 2.对ListBox控件(IDC_LIST1)关联控件变量m_checkListBox1,将控件变量类型CListBox -> CCheckListBox(需要手动完成). //修改控件变量类型:CListBox -> CCheckListBox CCheckListBox m_chec

【VC编程技巧】控件?4.2自定义EDIT(只限字母字符输入)

4.2自定义EDIT 自定义button,自定义editbox可以使button和editbox更符合自己的需求.请看下面示例:只限字母字符输入的editbox建立. 1.了解函数CWnd::SubclassDlgItem BOOL SubclassDlgItem( UINT nID, CWnd* pParent ); 说明:调用这个函数可以"动态子类化"从对话框模板中创建出来的控件:并且将控件绑定在CWnd对象上. 参数: nID   控件的ID pParent  控件父层(一般是对

【VC编程技巧】控件?4.3Pictrue控件(打造成对话框分割线)

4.3Pictrue控件(打造成对话框分割线) 对话框中,添加适量的分割线会使得对话框的格局更清晰,合理. 1.添加Picture控件到对话框,拖拽成一条线,就可以变成对话框中的分割线. 图1 2.设置Picture控件属性Sunken,可以使分割线有下陷的效果. 图2. 3.通过关联Pictrue控件变量的ShowWindows()函数控制分割线的显示和隐藏. void CPictrueLineDlg::OnBnClickedShow() { //显示分割线m_staticLine m_sta

【VC编程技巧】窗体?3.5对单文档或者多文档程序制作启动画面

(一)概要: 文章描述了怎样通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于单文档程序(SDI)我们可以很方便利用微软提供的组件Visual C++ Component (Splash Screen).因为在Microsoft Visual Studio 6.0以后的版本或者Visual C++ .NET没有提供这个组件,我们可以通过自定义对话框来实现Splash Screen

积累的VC编程小技巧之对话框

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U

积累的VC编程小技巧之工具提示

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U

积累的VC编程小技巧之树操作

1.如何在TreeList中加图标? [问题提出]  请问treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加图象呀?  [解决方法]  1)    HICON hicon[8];    m_imageList.Create(16,16,0,8,8);    hicon[0]=AfxGetApp()->LoadIcon(IDI_ICON0);    hicon[1]=AfxGetApp()->LoadIcon(IDI_ICON1);    hicon[2

积累的VC编程小技巧之图标、光标及位图

1.图标透明 (1).Windows中的图标其实是有两个图像组成的,其中一个用于与它要显示的位置的图像做"AND"操作,另一个作"XOR"操作. 透明:用"白色"AND,用"黑色"XOR反色:用"白色"AND,用"白色"XOR正常色:用"黑色"AND,用正常颜色XOR.(2). WIN9X中好像是对像素的操作实现透明的WIN2K中就有API直接实现透明了!WIN2K中