首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎样去掉文件的只读属性?该怎么处理

2012-03-29 
怎样去掉文件的只读属性?我在用fopen写一个文件的时候,如果这个文件已经存在并且是只读的,我就没法打开.我

怎样去掉文件的只读属性?
我在用fopen写一个文件的时候,如果这个文件已经存在并且是只读的,我就没法打开.
我想把该文件的只读(并且是系统)文件的属性去掉.
已经查到相关的指令是:

DOS下输入
attrib.exe   FileName   -h   -s  

但因为我的是windows程序,如果用system命令来执行的话,会出现一下闪黑屏(即dos窗口出现),所以我想用windows的CreateProcess来实现,可是不知道CreateProcess的命令参数(即 "FileName   -h   -s ")是加在哪儿的,有谁能给我一个参考程序.谢谢!



[解决办法]
三、 文件属性信息的获取与更改

  为了更好的保存获取到的文件属性信息,对应于文件属性构造一个自定义的FILE_INFO数据结构,获取的属性信息可暂存于此:

typedef struct _FILE_INFO {
  TCHAR szFileTitle[128]; //文件的标题名
  DWORD dwFileAttributes; //文件的属性
  FILETIME ftCreationTime; //文件的创建时间
  FILETIME ftLastAccessTime; //文件的最后访问时间
  FILETIME ftLastWriteTime; //文件的最后修改时间
  DWORD nFileSizeHigh; //文件大小的高位双字
  DWORD nFileSizeLow; //文件大小的低位双字
  DWORD dwReserved0; //保留,为0
  DWORD dwReserved1; //保留,为0
} FILE_INFO, * PFILE_INFO;

  首先用FindFirstFile()函数将文件属性获取到WIN32_FIND_DATA 结构对象FindFileData中去,之后可以用FindClose()将其关闭,并把FindFileData中的有关文件属性信息的内容复制到自定义结构FILE_INFO的结构对象FileInfo中备用。下面是关于这部分描述的部分关键代码:

//声明结构对象
FILE_INFO FileInfo;
WIN32_FIND_DATA FindFileData;
……
//获取文件属性信息
FindClose(FindFirstFile( "Test.txt ",&FindFileData));
memset(&FileInfo,0,sizeof(FILE_INFO));
……
//将文件属性信息保存到FileInfo中备用
strcpy(FileInfo.szFileTitle,myFile.GetFileTitle());
FileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
FileInfo.ftCreationTime = FindFileData.ftCreationTime;
FileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
FileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
FileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;
FileInfo.nFileSizeLow = FindFileData.nFileSizeLow;
……

  在获取到文件的原始属性信息后既可以原封不动的将属性重新写到文件,也可以对其中某一项或某几项属性内容进行修改后再行写入文件,从而达到更改文件属性的目的。比如可以用SetFileTime()函数设置文件的创建时间、最近一次访问时间以及最近一次修改的时间等等:

SetFileTime((HANDLE)destFile.m_hFile, //待写入的文件句柄
&FileInfo.ftCreationTime, //文件的创建时间
&FileInfo.ftLastAccessTime, //文件最近一次的访问时间
&FileInfo.ftLastWriteTime); //文件最近一次的修改时间

  也可以用SetFileAttributes() 函数实现对文件属性的修改:

SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes);

  至于文件名的修改则更加简单,直接在创建文件时在CreateFile()或CFile类的成员函数Open里直接对文件名参数进行设置即可。

  小结:本文通过对WIN32_FIND_DATA结构和SetFileTime()、SetFileAttributes()等主要函数实现了对磁盘文件的相关属性信息的获取与修改。用此技术可以在通讯等对文件有严格要求的应用领域实现文件全部信息(包括文件内容、文件名以及文件属性等)的完整传送。本文所述程序在Windows 98下由Microsoft Visual C++ 6.0编译调试通过。

热点排行