您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第09章 文件与剪贴板
第9章文件操作文件夹操作文件操作剪贴板操作一、文件夹操作BOOLCreateDirectory(–LPCTSTRlpPathName,LPSECURITY_ATTRIBUTESlpSecurityAttributes);BOOLRemoveDirectory(–LPCTSTRlpPathName);二、文件操作1、文件操作的特点•长文件名•共享访问•异步访问2、文件操作的一般过程以某种访问方式打开文件;CreateFile在文件定位访问的起点;SetFilePointer对文件进行操作ReadFileWriteFile关闭文件CloseHandle新建、打开一个文件。HANDLECreateFile(LPCTSTRlpFileName,//文件名DWORDdwDesiredAccess,//存取方式DWORDdwShareMode,//共享方式LPSECURITY_ATTRIBUTESlpSecAttr,//安全属性DWORDdwCreationDisposition,//创建说明DWORDdwFlagsAndAttributes,//文件属性HANDLEhTemplateFile)//文件属性摸板CreateFile函数dwDesiredAccess设置对文件的访问模式:可取值:GENERIC_READGENERIC_WRITE•dwShareMode设置指定文件的共享权限:可取值:0表示该文件不能被共享FILE_SHARE_READFILE_SHARE_WRITE参数说明:dwDesiredAccessdwShareMode•设置怎样创建文件:可取值:CREATE_NEW创建一个新文件,若文件已存在,则失败。CREATE_ALWAYS总是创建一个新文件,无论文件存在与否。OPEN_ALWAYS如文件存在,打开。不存在就创建。OPEN_EXISTING如文件存在,打开,不存在,则失败TRUNCATE_EXISTING打开已存在文件,并设置长度为0,如不存在,失败。dwCreationDisposition•设置文件属性和其他的一些标志:可取值:FILE_ATTRIBUTE_ARCHIVE存档文件FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_READONLYFILE_ATTRIBUTE_SYSTEMFILE_ATTRIBUTE_NORMAL常用的标志:FILE_FLAG_OVERLAPPED指定打开的文件要进行异步(可使用较长时间操作)操作。dwFlagsAndAttributes•表示如何设置文件属性可取值:NULL表示忽略该参数某个已打开文件的句柄当是某个已打开文件的句柄时,则将忽略dwFlagsAndAttributes参数对文件属性的设置,而用该句柄指定文件的属性,但该文件必须必须用GENERIC_READ方式打开。如果CreateFile正在打开一个已存在的文件,则该参数被忽略。hTemplateFile关闭文件BOOLCloseHandle(–HANDLEhObject);该函数可以对文件进行同步或异步的读。BOOLReadFile(HANDLEhFile,LPVOIDlpBuffer,DWORDnNumberOfBytesToRead,//准备读取的字节数LPDWORDlpNumberOfBytesReaded,//实际读取的字节数LPOVERLAPPEDlpOverlapped)如果要同步读文件,则设置最后一个参数为NULL;要异步读指定了FILE_FLAG_OVERLAPPED,则需设置该参数。ReadFile函数BOOLWriteFile(HANDLEhFile,LPCVOIDlpBuffer,DWORDnNumberOfBytesToWrite,LPDWORDpNumberOfBytesWritten,LPOVERLAPPEDlpOverlapped)如果要同步读写文件,则设置最后一个参数为NULL;要异步读写,则需设置该参数。WriteFile函数(4)GetFileInformationByHandle函数BOOLGetFileInformationByHandle(HANDLEhFile,LPBY_HANDLE_FILE_INFORMATIONlpFileInformation)获取文件信息lpFileInformationtypedefstruct_BY_HANDLE_FILE_INFORMATION{DWORDdwFileAttributes;//见CreateFileFILETIMEftCreationTime;//FILETIME结构FILETIMEftLastAccessTime;FILETIMEftLastWriteTime;DWORDdwVolumeSerialNumber;DWORDnFileSizeHigh;DWORDnFileSizeLow;DWORDnNumberOfLinks;//关连用户DWORDnFileIndexHigh;//文件打开后系统给的IDDWORDnFileIndexLow;//用以鉴别是否同一文件}BY_HANDLE_FILE_INFORMATION读写文件属性DWORDGetFileAttributes(LPCTSTRlpFileName);BOOLSetFileAttributes(LPCTSTRlpFileName,DWORDdwFileAttributes);FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_READONLYFILE_ATTRIBUTE_SYSTEMFileTimeToSystemTimeBOOLFileTimeToSystemTime(–constFILETIME*lpFileTime,LPSYSTEMTIMElpSystemTime);typedefstruct_FILETIME{DWORDdwLowDateTime;DWORDdwHighDateTime;}FILETIME,*PFILETIME;typedefstruct_SYSTEMTIME{WORDwYear;WORDwMonth;WORDwDayOfWeek;WORDwDay;WORDwHour;WORDwMinute;WORDwSecond;WORDwMilliseconds;}SYSTEMTIME,*PSYSTEMTIME;根据给定的搜索路径查找指定的文件,并返回指定文件的路径。DWORDSearchPath(LPCTSTRlpPath,//searchpathLPCTSTRlpFileName,//filenameLPCTSTRlpExtension,//fileextensionDWORDnBufferLength,//sizeofbufferLPTSTRlpBuffer,//foundfilenamebufferLPTSTR*lpFilePart//纯文件名)默认的搜索路径次序:当前目录、Windows操作目录、Windows系统目录、Path设置的目录。SearchPath函数*GetSystemDirectoryGetWindowsDirectoryHANDLEFindFirstFile(LPCTSTRlpFileName,LPWIN32_FIND_DATAlpFindFileData);BOOLFindNextFile(HANDLEhFindFile,LPWIN32_FIND_DATAlpFindFileData);移动文件指针到指定的位置。DWORDSetFilePointer(HANDLEhFile,LONGlDistanceToMove,//距离低32bitPLONGlpDistanceToMoveHigh,//高32bitDWORDdwMoveMethod)dwMoveMethod参数指定移动方式:•FILE_BEGIN从文件开始•FILE_CURRENT从当前位置•FILE_END从文件结尾SetFilePointer函数•BOOLSetEndOfFile()设置文件的结束标志(EOF)。BOOLSetEndOfFile(HANDLEhFile)•BOOLLockFile()锁定文件的某片区域BOOLLockFile(HANDLEhFile,DWORDdwFileOffsetLow,DWORDdwFileOffsetHigh,DWORDnNumberOfBytesToLockLow,DWORDnNumberOfBytesToLockHigh)其他的一些常用函数1BOOLUnlockFile()解锁锁定的区域BOOLUnlockFile(HANDLEhFile,//handletofileDWORDdwFileOffsetLow,DWORDdwFileOffsetHigh,DWORDnNumberOfBytesToUnlockLow,DWORDnNumberOfBytesToUnlockHigh)•BOOLFlushFileBuffers()将缓冲区内容写入磁盘。BOOLFlushFileBuffers(HANDLEhFile)其他的一些常用函数2其他的一些常用函数3DWORDGetFileSize(HANDLEhFile,LPDWORDlpFileSizeHigh);遍历磁盘目录voidCSiteMapMakerDlg::DirPath(CStringsPath){CFileFindFF;CStringsp,st,sl;if(FF.FindFile(sPath+*.*)){while(FF.FindNextFile()){sp=FF.GetFilePath();if((!FF.IsDots())&&FF.IsDirectory()){sp+=\\;DirPath(sp);}if(!FF.IsDirectory()){m_List.AddString(sp);}}sp=FF.GetFilePath();if((!FF.IsDots())&&FF.IsDirectory()){sp+=\\;DirPath(sp);}if(!FF.IsDirectory()){m_List.AddString(sp);}}文件操作举例FileDemo三、剪贴板操作使用剪贴板之前,要考虑剪贴板支持的数据格式,一般的做法是,应用程序将数据转换为剪贴板支持的数据格式。系统预定义的剪贴板数据格式(常用)如下:•CF_TEXT•CF_OEMTEXT•CF_BITMAP•CF_DIB•CF_TIFF分为5个步骤:(1)拷贝数据到全局变量一般通过GlobalAlloc函数和GlobalLock函数实现。HGLOBALGlobalAlloc(UINTuFlags,//分配标识,常用的为GHND//=GMEM_MOVEABLE|GMEM_ZEROINITSIZE_TdwBytes)LPVOIDGlobalLock(HGLOBALhMem)(2)打开剪贴板BOOLOpenClipboard(HWNDhWnd//关联剪贴板的窗口句柄)向剪贴板发送数据1(3)删除剪贴板中的内容BOOLEmptyClipboard(VOID)(4)向剪贴板传送文本全局内存句柄HANDLESetClipboardData(UINTuFormat,//clipboardformatHANDLEhMem//datahandle)(5)关闭剪贴板BOOLCloseClipboard(VOID)例如,下面的程序代码向剪贴板拷贝数据。向剪贴板发送数据2HANDLEhText;LPTSTRlpText;if(!(hText=GlobalAlloc(GHND,200))){MessageBox(NULL,Allocmemoryfail,,MB_OK);return;}lpText=(LPTSTR)GlobalLock(hText);lstrcp
本文标题:第09章 文件与剪贴板
链接地址:https://www.777doc.com/doc-3258215 .html