c++文件操作.docx
- 文档编号:10877587
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:18
- 大小:22.30KB
c++文件操作.docx
《c++文件操作.docx》由会员分享,可在线阅读,更多相关《c++文件操作.docx(18页珍藏版)》请在冰豆网上搜索。
c++文件操作
HANDLEhFile=:
:
CreateFile(argv[1],GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
在这句中,vs2005提示CreateFileW第一个参数无法从char*转换成LPCWSTR,这该怎么办?
(上面的提示没打错,是多了个W)我看msdn上给的例子换成一个字符串也不行,谢谢帮忙了。
HANDLEhFile=:
:
CreateFileA(argv[1],GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
CreateFile的涵义是创建File这个内核对象,而不是创建物理磁盘上的“文件”。
在Win32API中有一系列操作内核对象的函数,创建内核对象的函数大多命名为CreateXxxx型。
//****************************************************************************************
解读VC++编程中的文件操作API和CFile类中CreateFile方法(转)
一下借鉴与网络资料和书籍。
目的一是作为将来学习查找对资料的一种保存,二是供学习相同内容的人学习只用
VC编程中,操作文件的方法主要有两种:
利用API函数和MFC的CFile类。
微软在其中封装了文件的一般操作,下面我就介绍一下如何利用这两种方法实现文件操作。
创建或打开一个文件
API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。
HANDLECreateFile(
LPCTSTRlpFileName,//要打开的文件名
DWORDdwDesiredAccess,//文件的操作属性
DWORDdwShareMode,//文件共享属性
LPSECURITY_ATTRIBUTESlpSecurityAttributes,//文件安全特性
DWORDdwCreationDisposition,//文件操作
DWORDdwFlagsAndAttributes,//文件属性
HANDLEhTemplateFile//如果不为零,则指定一个文件句柄。
新文件将从这个文件中复制扩展属性
);
文件的操作属性:
如果为零,表示只允许获取与一个设备有关的信息,GENERIC_READ表示允许对设备进行读访问;如果为GENERIC_WRITE表示允许对设备进行写访问(可组合使用);
文件的共享属性:
零表示不共享;FILE_SHARE_READ或FILE_SHARE_WRITE表示允许对文件进行读/写共享访问;
文件的操作有:
·CREATE_NEW:
创建文件;如文件存在则会出错
·CREATE_ALWAYS:
创建文件,会改写前一个文件
·OPEN_EXISTING:
文件必须已经存在。
由设备提出要求
·OPEN_ALWAYS:
如文件不存在则创建它
·TRUNCATE_EXISTING:
将现有文件缩短为零长度
文件属性有:
·FILE_ATTRIBUTE_ARCHIVE:
标记归档属性
·FILE_ATTRIBUTE_COMPRESSED:
将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
·FILE_ATTRIBUTE_NORMAL:
默认属性
·FILE_ATTRIBUTE_HIDDEN:
隐藏文件或目录
·FILE_ATTRIBUTE_READONLY:
文件为只读
·FILE_ATTRIBUTE_SYSTEM:
文件为系统文件
·FILE_FLAG_WRITE_THROUGH:
操作系统不得推迟对文件的写操作
·FILE_FLAG_OVERLAPPED:
允许对文件进行重叠操作
·FILE_FLAG_NO_BUFFERING:
禁止对文件进行缓冲处理。
文件只能写入磁盘卷的扇区块
·FILE_FLAG_RANDOM_ACCESS:
针对随机访问对文件缓冲进行优化
·FILE_FLAG_SEQUENTIAL_SCAN:
针对连续访问对文件缓冲进行优化
·FILE_FLAG_DELETE_ON_CLOSE:
关闭了上一次打开的句柄后,将文件删除。
特别适合临时文件
可以组合的属性有:
FILE_FLAG_WRITE_THROUGH,FILE_FLAG_OVERLAPPED,FILE_FLAG_NO_BUFFERING,FILE_FLAG_RANDOM_ACCESS,FILE_FLAG_SEQUENTIAL_SCAN,FILE_FLAG_DELETE_ON_CLOSE,FILE_FLAG_BACKUP_SEMANTICS,FILE_FLAG_POSIX_SEMANTICS,FILE_FLAG_OPEN_REPARSE_POINT,FILE_FLAG_OPEN_NO_RECALL
如果成功返回一个打开文件得句柄,如果调用函数之前文件存在,文件操作属性为:
CREATE_ALWAYS或OPEN_ALWAYS,使用GetLastError函数返回的是ERROR_ALREADY_EXISTS(包括函数操作成功),如果之前函数不存在,则返回0。
使用失败返回INVALID_HANDLE_VALUE,要取得更多的信息,使用GetLastError函数。
文件关闭用:
BOOLCloseHandle(HANDLEhObject//handletoobjecttoclose);
例:
HANDLEhandle;
DWORDNum;
handle=:
:
CreateFile("new.tmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);
if(INVALID_HANDLE_VALUE!
=handle)
{
:
:
SetFilePointer(handle,0,0,FILE_BEGIN);
charBuffer[]="这是个刚创建的文件";
:
:
WriteFile(handle,Buffer,sizeof(Buffer),&Num,NULL);
ZeroMemory(Buffer,sizeof(Buffer));
:
:
SetFilePointer(handle,0,0,FILE_BEGIN);
:
:
ReadFile(handle,Buffer,sizeof(Buffer),&Num,NULL);
MessageBox(Buffer);
:
:
CloseHandle(handle);
}
可以改变上面的创建文件的属性和操作看下不同效果。
CFile创建和打开一个文件:
下面简单介绍下几个构造函数创建文件和打开文件的方法:
CFile(LPCTSTRlpszFileName,UINTnOpenFlags);
throw(CFileException);
CFile();
BOOLOpen(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);
lpszFileName:
文件名称,可以是相对路径,绝对路径或网络路径
nOpenFlags:
打开方式有:
·CFile:
:
modeCreate调用构造函数构造一个新文件,如果文件已存在,则长度变成0。
·CFile:
:
modeNoTruncate此值与modeCreate组合使用。
如果所创建的文件已存在则其长度不变为0。
因而此文件被打开,或者作为一个新文件或者作为一个已存在的文件。
这将是很有用的,例如当打开一个可能存在也可能不存在的文件时。
·CFile:
:
modeRead打开文件仅供读。
·CFile:
:
modeReadWrite打开文件供读写。
·CFile:
:
modeWrite打开文件仅供写。
·CFile:
:
modeNoInherit阻止文件被子进程继承。
·CFile:
:
ShareDenyNone不禁止其它进程读或写访问,打开文件。
如果文件已被其它进程以兼容模式打开,则Create失败。
·CFile:
:
ShareDenyRead打开文件,禁止其它进程读此文件。
如果文件已被其它进程以兼容模式打开,或被其它进程读,则Create失败。
·CFile:
:
ShareDenyWrite打开文件,禁止其它进程写此文件。
如果文件已被其它进程以兼容模式打开,或被其它进程写,则Create失败。
·CFile:
:
ShareExclusive以独占模式打开文件,禁止其它进程对文件的读写。
如果文件已经以其它模式打开读写(即使被当前进程),则构造失败。
·CFile:
:
ShareCompat此标志在32位MFC中无效。
此标志在使用CFile:
:
Open时映射为CFile:
:
ShareExclusive。
·CFile:
:
typeText对回车换行设置特殊进程(仅用于派生类)。
·CFile:
:
typeBinary设置二进制模式(仅用于派生类)。
MSDN中的一个例子:
char*pFileName="test.dat";
TRY
{
CFilef(pFileName,CFile:
:
modeCreate|CFile:
:
modeWrite);
}
CATCH(CFileException,e)
{
#ifdef_DEBUG
afxDump<<"Filecouldnotbeopened"<
#endif
}
END_CATCH
CFilefileTest;
char*pFileName="test.dat";
TRY
{
fileTest.Open(pFileName,CFile:
:
modeCreate|CFile:
:
modeWrite);
}
CATCH_ALL(e)
{
fileTest.Abort();
THROW_LAST();
}
END_CATCH_ALL
文件的读写定位
定位文件中的数据是很重要的,这决定了写入的数据在文件中的位置。
API函数
DWORDSetFilePointer(
HANDLEhFile,//文件的句柄
LONGlDistanceToMove,//字节偏移量r
PLONGlpDistanceToMoveHigh,//指定一个长整数变量,其中包含了要使用的一个高双字偏移(一般用来操作大型文件)。
可设为零,表示只使用lDistanceToMove
DWORDdwMoveMethod//文件定位
);
dwMoveMethod文件定位的方式有三种:
·FILE_BEGIN:
从文件开始处。
·FILE_CURRENT:
从当前位置。
·FILE_END:
从文件的末尾。
此函数可以用来定位大型文件,lpDistanceToMoveHigh是高32位,lDistanceToMove是低32位。
如果lpDistanceToMoveHigh为NULL时,函数操作成功,返回的是当前文件数据的偏移量,如果lpDistanceToMoveHigh不NULL,则返回数据的偏移量高32位放在lpDistanceToMoveHigh中,函数调用失败返回的是0xffffffff.
BOOLSetEndOfFile(HANDLEhFile//文件的句柄);
CFile类的文件数据定位函数有:
LONGSeek(LONGlOff,UINTnFrom);
throw(CFileException);
如果要求的位置合法,则Seek返回从文件开始起的新字节偏移量lOff:
指针移动的字节数。
nFrom:
指针移动的模式。
可以是CFile:
:
begin,CFile:
:
current,CFile:
:
end
voidSeekToBegin();
DWORDSeekToEnd();//返回文件长度(字节数)。
读取位图文件的信息的例子:
CFilefile;
BITMAPINFOHEADERbmpinfo;
try
{
file.Open("D:
\ToolBar.bmp",CFile:
:
modeRead);
file.Seek(sizeof(BITMAPFILEHEADER),CFile:
:
begin);
file.Read(&bmpinfo,sizeof(BITMAPINFOHEADER));
CStringstr;
str.Format("位图文件的长是%d,高%d",bmpinfo.biWidth,bmpinfo.biHeight);
MessageBox(str);
file.Close();
}
catch(CFileException*e)
{
CStringstr;
str.Format("读取数据失败的原因是:
%d",e->m_cause);
MessageBox("str");
file.Abort();
e->Delete();
}
读取数据:
BOOLReadFile(
HANDLEhFile,//文件的句柄
LPVOIDlpBuffer,//用于保存读入数据的一个缓冲区
DWORDnNumberOfBytesToRead,//要读入的字符数
LPDWORDlpNumberOfBytesRead,//从文件中实际读入的字符数
LPOVERLAPPEDlpOverlapped//如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
该结构定义了一次异步读取操作。
否则,应将这个参数设为NULL
);
CFile的成员函数有:
UINTRead(void*lpBuf,UINTnCount);
throw(CFileException);//返回值是传输到缓冲区的字节数。
写入数据:
BOOLWriteFile(
HANDLEhFile,//文件的句柄
LPCVOIDlpBuffer,//要写入的一个数据缓冲区
DWORDnNumberOfBytesToWrite,//要写入数据的字节数量。
如写入零字节,表示什么都不写入,但会更新文件的"上一次修改时间"。
LPDWORDlpNumberOfBytesWritten,//实际写入文件的字节数量
LPOVERLAPPEDlpOverlapped//OVERLAPPED,倘若在指FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。
该结构定义了一次异步写操作。
否则,该参数应置为NULL
);
voidWrite(constvoid*lpBuf,UINTnCount);
throw(CFileException);
lpBuf:
指向用户提供的缓冲区,包含将写入文件中的数据
nCount:
从缓冲区内传输的字节数。
对文本模式的文件,回车换行作为一个字符。
一个文件中写入数据的例子:
CFilefile;
try
{
file.Open("d:
/my.dat",CFile:
:
modeCreate|CFile:
:
modeWrite);
file.SeekToBegin();
charData[]="111\n1111";
file.Write(Data,sizeof(Data));
file.Flush();
file.Close();
}
catch(CFileException*e)
{
CStringstr;
str.Format("读取数据失败的原因是:
%d",e->m_cause);
MessageBox("str");
file.Abort();
e->Delete();
}
取得和设置文件的创建时间、最后访问时间、最后写时间
BOOLGetFileTime(
HANDLEhFile,//文件句柄
LPFILETIMElpCreationTime,//创建时间
LPFILETIMElpLastAccessTime,//最后访问时间
LPFILETIMElpLastWriteTime//最后写时间
);
BOOLSetFileTime(
HANDLEhFile,
CONSTFILETIME*lpCreationTime,
CONSTFILETIME*lpLastAccessTime,
CONSTFILETIME*lpLastWriteTime
);
typedefstruct_FILETIME{
DWORDdwLowDateTime;
DWORDdwHighDateTime;
}FILETIME;
取得三个参数都是FILETIME结构,得到的都是UTC时间,可以通过API函数FileTimeToLocalFileTime()和FileTimeToSystemTime()将他们转换为本地时间和系统时间格式,也可以通过LocalFileTimeToFileTime和SystemTimeToFileTime()转换回来,通过SetFileTime设置文件的创建时间、最后访问时间、最后写时间。
由于使用的时候要先打开文件,而且取得的最后访问时间就是当前时间,没有多大意义,且比较麻烦,下面介绍CFile类中的静态方法。
staticBOOLPASCALGetStatus(LPCTSTRlpszFileName,CFileStatus&rStatus);
staticvoidSetStatus(LPCTSTRlpszFileName,constCFileStatus&status);
throw(CFileException);
返回的是一个CfileStatus对象,这个结构的具体的成员变量包括:
structCFileStatus
{
CTimem_ctime;//文件创建时间
CTimem_mtime;//文件最近一次修改时间
CTimem_atime;//文件最近一次访问时间
LONGm_size;//文件大小
BYTEm_attribute;//文件属性
BYTE_m_padding;//没有实际含义,用来增加一个字节
TCHARm_szFullName[_MAX_PATH];//绝对路径
#ifdef_DEBUG
//实现Dump虚拟函数,输出文件属性
voidDump(CDumpContext&dc)const;
#endif
};
例子:
CFileStatusstatus;
char*path="D:
\VSS";
if(CFile:
:
GetStatus(path,status))
{
CStringcTime,mTime,aTime;
cTime=status.m_ctime.Format("文件建立时间:
%Y年%m月%d日%H时%M分%S秒");
mTime=status.m_mtime.Format("文件最近修改时间:
%Y年%m月%d日%H时%M分%S秒");
aTime=status.m_atime.Format("文件最近访问时间:
%Y年%m月%d日%H时%M分%S秒");
CStringstr;
str=cTime+"\n"+mTime+"\n"+aTime;
MessageBox(str);
}
取得和设置文件的属性
DWORDGetFileAttributes(
LPCTSTRlpFileName//文件或文件夹路经
);
BOOLSetFileAttributes(
LPCTSTRlpFileName,//文件名
DWORDdwFileAttributes//要设置的属性
);
取得的文件属性包括:
FILE_ATTRIBUTE_ARCHIVE,FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_NORMAL,FILE_ATTRIBUTE_OFFLINE,FILE_ATTRIBUTE_READONLY,FILE_ATTRIBUTE_SYSTEM,FILE_ATTRIBUTE_TEMPORARY
不能设置的文件属性包括有:
FILE_ATTRIBUTE_COMPRESSED,FILE_ATTRIBUTE_DIRECTORY,FILE_ATTRIBUTE_ENCRYPTED,FILE_ATTRIBUTE_REPARSE_POINT,FILE_ATTRIBUTE_SPARSE_FILE,FILE_ATTRIBUTE_SYSTEM。
CFileStatus中也定义了一组属性:
enumAttribute{
normal,
readOnly,
hidden,
system,
volume,
directory,
archive
};
可以通过if((status.m_attribute&readOnly)==FILE_ATTRIBUTE_READONLY)来判断,这里利用另外的API来实现获得文件的详细信息:
HANDLEFindFirstFile(
LPCTSTRlpFileName,//文件或文件夹路经r
LPWIN32_FIND_DATAlpFindFileData
);
BOOLFindNextFile(
HANDLEhFindFile,
LPWIN32_FIND_DATAlpFindFileData
);
BOOLFindClose(HANDLEhFindFile);
取得的是一个WIN32_FIND_DATA结构;
typedefstruct_WIN32_FIND_DATA{
DWORDdwFileAttributes;//文件属性
FILETIMEftCreationTime;//文件创建时间
FILETIMEftLastAccessTime;//文件最后一次访问时间
FILETIMEftLastWriteTime;//文件最后一次修改时间
DWORDnFileSizeHigh;//文件长度高32位
DWORDnFileSizeLow;//文件长度低32位
DWORDdwReserved0;//系统保留
DWORDdwReserved1;//系统保留
TCHARcFileName[MAX_PATH];//长文件名
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 文件 操作
![提示](https://static.bdocx.com/images/bang_tan.gif)