您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第9章 文件及剪贴板操作
第9章文件及剪贴板操作文件操作是Windows应用程序经常要涉及的内容,利用Windows的API函数,能很好地实现文件操作的功能。Windows操作系统32位操作系统最大文件长度可达4GB支持长达56字节的文件名同一文件可被不同进程访问HANDLECreateFile(LPCTSTRlpszName,//文件名DWORDdwDesiredAccess,//文件访问形式标识,读操作为GENERIC_READ,写操作为GENERIC_WRITEDWORDdwshareMode,//文件的共享模式标识LPSECURITY_ATTRIBUTESlpsecurityAttributes,DWORDdwCreationDisposition,//文件创建操作标识,DWORDdwFlagsAndAttributes,//文件属性标识HANDLEhTemplateFile//指向文件属性模板的句柄)CreateFile:创建或打开一个文件文件共享模式可写共享,其值为FILE_SHARE_WRITE可读共享,其值为FILE_SHARE_READ该文件不能共享,则其值为0指向安全属性数据结构的指针,常为NULL常用的文件操作函数ReadFile函数:从文件指针的位置开始读取一个现存文件中的数据BOOLReadFile(HANDLEhFile,//打开的文件句柄;LPVOIDlpBuffer,//指向接收读入数据缓冲区地址的指针;DWORDnNumberOfBytesToRead,//将从文件中读入的数据字数;LPDWORDlpNumberOfBytesRead,//指向实际读取字节数的指针;LPOVERLAPPEDlpOverlapped//指向一个OVERLAPPED数据结构的指针。)NULL表明从当前位置读取数据WriteFile函数:从文件指针的位置开始向现存文件中的写入数据。BOOLWriteFile(HANDLEhFile,//打开的文件句柄:LPVOIDlpBuffer,//指向写入数据的缓冲区地址的指针:DWORDnNumberOfBytesToWrite,//将向文件中写入的数据字数:LPDWORDlpNumberOfBytesWitten,//指向实际写入字节数的针:LPOVERLAPPEDlpOverlapped,//指向一个OVERLAPPED数据结构的指针。)NULL表明从当前位置写入数据GetFileInformartiomByHandle函数获取指定文件的信息,并将其保存在BY_HANDLE_FILE_INFORMATION数据结构中BOOLGetFilelnformationByHandle(HANDLEhFile,LPBY_HANDEL_FILE_INFORMATIONlpFilelnformation)为指向BY_HANDLE_FILE_INFORMATION结构的指针SearchPath函数根据给定搜索路径查找指定文件并返回指定文件的路径DWORDSearchPath(LPCTSTRlpPath//指定搜索路径;若为NULL,则采用默认路径;LPCTSTRlpFileName,//搜索的文件名;LPCTSTRlPExtension,//搜索文件的扩展名;DWORDnBufferLength,//用来接收文件路径名的缓冲区长度;LPTSTRlpBuffer,//指向接收文件路径名的缓冲区;LPTSTR*lPFilepart//指向路径名中文件名部分地址的指针。//如果调用该函数未指定搜索路径,//则采用默认系统路径进行搜索)lpFileName默认的搜索次序:(1)当前目录;(2)Windows操作目录;(3)Windows系统所在目录;(4)PATH环境变量包含的目录SetFilePionter函数:设置文件指针的位置DWORDSetFilePoiner(HANDLEhFile,//文件句柄LONGlpistanceToMove,//指针移动的字节数LPLONGlpDistanceToMoveHigh,//指向指针移动距离的高位指针DWORDdwMoveMethod//指针移动参考位置标识)文件操作应用举例【例9-1】本例创建一个具有打开文件功能的对话框,并可进行文件的编辑与保存。LRESULTAPIENTRYMainWndProc(......)1.{staticHWNDhWndEdit;2.switch(message)3.{caseWM_CREATE:4.hWndEdit=CreateWindow(EDIT,NULL,WS_CHILD|WS_VISIBLE|WS_HSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL,0,0,0,0,hWnd,(HMENU)ID_EDITCHILD,(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL);5.break;6.caseWM_SIZE:7.MoveWindow(hWndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);break;8.caseWM_COMMAND:9.switch(LOWORD(wParam))10.{caseIDM_FILEOPEN:OpenTextFile(hWnd,hWndEdit);break;11.caseIDM_FILESAVE:SaveTextFile(hWnd,hWndEdit);break;12.caseIDM_EXIT:SendMessage(hWnd,WM_DESTROY,0L,0L);break;13.caseIDM_ABOUT:DialogBox(hInst,AboutBox,hWnd,(DLGPROC)About);break;14.default:return(DefWindowProc(hWnd,message,wParam,lParam));15.}16.break;17.caseWM_DESTROY:PostQuitMessage(0);break;18.default:return(DefWindowProc(hWnd,message,wParam,lParam));}return(0);}//*调用公共对话框函数,显示【打开】对话框,检取用户选择的文本文件,然后打开该文本文件到编辑控件中。voidOpenTextFile(HWNDhWnd,HWNDhWndEdit){OPENFILENAMEOpenFileName;charszDirName[MAX_PATH]=;charszFile[MAX_PATH]=\0;charszFileTitle[MAX_PATH]=\0;//OPENFILENAME结构的过滤器规格说明。charszFilter[]={“文本文件(*.txt)\0*.txt\0C源程序文件(*.c)\0*.c\0所有文件\0*.*\0};OpenFileName.lStructSize=sizeof(OPENFILENAME);......OpenFileName.lpstrDefExt=*.txt;OpenFileName.lCustData=0;OpenFileName.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;填写OpenFileName对象属性1.if(GetOpenFileName(&OpenFileName))2.{HANDLEhFile;DWORDdwFileSize,dwBytesRead;char*lpBufPtr;3.hFile=CreateFile(......);//打开指定的文件4.if(hFile!=INVALID_HANDLE_VALUE)5.{dwFileSize=GetFileSize(hFile,NULL);//检取文件字节大小6.if(dwFileSize!=0xFFFFFFFF)7.{lpBufPtr=(char*)malloc(dwFileSize);//分配用来读入文件的缓冲区8.if(lpBufPtr!=NULL)9.{ReadFile(hFile,(LPVOID)lpBufPtr,dwFileSize,&dwBytesRead,NULL);10.if(dwBytesRead!=0){//把文件内容装入多行编辑控件中11.SendMessage(hWndEdit,WM_SETTEXT,0,(LPARAM)lpBufPtr);12.SetWindowText(hWnd,OpenFileName.lpstrFile);}13.else14.MessageBox(hWnd,“读入字节数为零”,NULL,MB_OK|MB_ICONEXCLAMATION);15.free(lpBufPtr);16.}17.else18.MessageBox(NULL,内存分配失败!,NULL,MB_OK|MB_ICONEXCLAMATION);19.}20.else21.MessageBox(NULL,检取文件大小失败,NULL,MB_OK|MB_ICONEXCLAMATION);22.CloseHandle(hFile);23.}24.elseMessageBox(hWnd,打开文件失败,NULL,MB_OK|MB_ICONEXCLAMATION);25.}}把文件内容读入缓冲区//*调用公共对话框函数,显示【另存为】对话框,//*用户选择文本名,然后把编辑控件中的内容保存到该文件中voidSaveTextFile(HWNDhWnd,HWNDhWndEdit){OPENFILENAMEOpenFileName;charszDirName[MAX_PATH]=;charszFile[MAX_PATH]=\0;charszFileTitle[MAX_PATH]=\0;charszFilter[]={AllFiles\0*.*\0};OpenFileName.lStructSize=sizeof(OPENFILENAME);OpenFileName.hWndOwner=hWnd;......OpenFileName.lCustData=0;OpenFileName.Flags=OFN_OVERWRITEPROMPT;1.if(GetSaveFileName(&OpenFileName))2.{HANDLEhFile;DWORDdwFileSize,dwBytesWrite;char*lpBufPtr;3.hFile=CreateFile(......);4.if(hFile!=INVALID_HANDLE_VALUE)5.{//检取编辑控件内容的字节大小。6.dwFileSize=SendMessage(hWndEdit,WM_GETTEXTLENGTH,0,0);7.if(dwFileSize!=0)8.{lpBufPtr=(char*)malloc(dwFileSize);//分配文件缓冲区。9.if(dwFileSize!=0)10.{//把编辑控件中的内容装到文件缓冲区。11.SendMessage(hWndEdit,WM_GETTEXT,dwFileSize,(LPARAM)lpBufPtr);12.//把文件缓冲区中的数据存写到文件中。13.WriteFile(hFile,(LPVOID)lpBufPtr,dwFileSize,&dwBytesWrite,NULL);14.SetWindowText(hWnd,OpenFileName.lpstrFile);15.free(lpBufPtr);16.}17.else18.MessageBox(NULL,内存分配失败!,NULL,MB_OK|MB_ICONEXCLAMATION);19.}20.else21.MessageBox(NULL,编辑控件中内容为空,NULL,MB_OK|MB_ICONEXCLAM
本文标题:第9章 文件及剪贴板操作
链接地址:https://www.777doc.com/doc-3375836 .html