vc文件操作
- 格式:doc
- 大小:72.00 KB
- 文档页数:15
CategoryCD-ROM (1)关闭计算机 (1)重启计算机 (1)枚举所有字体 (1)只运行一个程序实例 (2)得到鼠标位置 (2)显示和隐藏程序菜单 (3)获取可执行文件的图标 (3)窗口自动靠边程序演示 (3)系统菜单添加菜单项 (5)动态增加或删除菜单 (6)改变应用程序的图标 (7)改变窗口标题的方法 (7)剪切板上通过增强元文件拷贝图像数据 (8)剪切板上文本数据的传送 (8)捕捉屏幕图像到剪切板中 (9)将位图缩放显示 (11)改变对话框中控件的颜色 (12)修改窗口外观 (14)获得应用程序主窗口的指针 (15)确定应用程序的路径 (15)获得其他程序的图标 (15)获得各种目录信息 (16)如何自定义消息 (16)改变窗口的缺省风格 (16)将窗口居中显示 (17)一启动就最大化和最小化 (17)限制窗口的大小 (17)创建一个字回绕的CEditView (18)程序保持极小状态 (18)移动窗口 (18)重置窗口的大小 (18)单击窗口标题栏以外区域使窗口移动 (19)改变视窗的背景颜色 (20)防止主框窗口在其说明中显示活动的文档名 (20)获取有关窗口正在处理的当前消息的信息 (21)代码中获取工具条和状态条的指针 (21)使能和禁止工具条的工具提示 (21)如何创建一个不规则形状的窗口 (22)获取应用程序的实例句柄 (24)如何编程结束应用程序 (24)创建和使用无模式对话框 (25)怎样加载其他的应用程序 (26)使窗口始终在最前方 (27)在对话框中显示一个位图 (27)获取一个对话控件的指针 (27)改变控件的字体 (28)OLE控件中使用OLE_COLOR数据类型 (28)在不使用通用文件打开对话的情况下如何显示一个文件列表 (29)旋转按钮控件 (29)用位图显示下压按钮 (29)创建三态下压按钮 (30)如何动态创建控件 (30)限制编辑框中的准许字符 (30)向列表框中添加多个项时防止闪烁 (32)向编辑控件中添加文本 (32)访问预定义的GDI对象 (32)获取GDI对象的属性信息 (33)实现一个橡皮区矩形 (34)更新翻转背景颜色的文本 (36)创建一个具有特定点大小的字体 (36)如何计算一个串的大小 (37)显示旋转文本 (37)显示包含标签字符的串 (39)串太长时如何在其末尾显示一个省略号 (39)为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 (39)在用户环境中如何确定系统显示元素的颜色 (40)查询和设置系统参数 (40)确定当前屏幕分辨率 (41)使用预定义Windows光标 (41)检索原先的Task Manager应用程序使用的任务列表 (41)确定Windows和Windows系统目录 (42)在哪儿创建临文件 (43)我怎样才能建立一个等待光标 (44)访问桌面窗口 (44)怎样用COLORREF (44)在应用程序中循环浏览已经打开的文档、视图 (45)MFC在窗口标题栏 (45)CD-ROM打开:mciSendString("Set cdAudio door open wait",NULL,0,NULL);关闭:mciSendString("Set cdAudio door closed wait",NULL,0,NULL);关闭计算机OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&OsVersionInfo); //获取操作系统版本信息if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS){//Windows98,调用ExitWindowsEx()函数重新启动计算机DWORD dwReserved;ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、//关机、关闭电源等操作// 退出前的一些处理程序}重启计算机typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针if(hInst != NULL){//获得函数的地址并调用之ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);(*ShutDownDialog)(0);}枚举所有字体LOGFONT lf;lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structurestrcpy(lf.lfFaceName,"");CClientDC dc (this);// Enumerate the font families::EnumFontFamiliesEx((HDC)dc,&lf,(FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);//枚举函数int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam){// Create a pointer to the dialog windowCDay7Dlg* pWnd = (CDay7Dlg*) lparam;// add the font name to the list boxpWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);// Return 1 to continue font enumerationreturn 1;}其中m_ctlFontList是一个列表控件变量只运行一个程序实例if( FindWindow(NULL,"程序标题")) exit(0);或CreateMutx:HANDLE m_hMutex = ::CreateMutex(NULL,true,_T("MBD"));if(GetLastError() == ERROR_ALREADY_EXISTS){ReleaseMutex(m_hMutex);::MessageBox(NULL,_T("应用程序已经运行!"),_T("系统提示"),MB_OK|MB_ICONSTOP);return FALSE;}也可以用CreateThread,方法同CreateMutex得到鼠标位置CPoint pt;GetCursorPos(&pt); //得到位置显示和隐藏程序菜单CWnd *pWnd=AfxGetMainWnd();if(b_m) //隐藏菜单{pWnd->SetMenu(NULL);pWnd->DrawMenuBar();b_m=false;}else{CMenu menu;menu.LoadMenu(IDR_MAINFRAME); ////显示菜单也可改变菜单项pWnd->SetMenu(&menu);pWnd->DrawMenuBar();b_m=true;menu.Detach();}获取可执行文件的图标HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); if (hIcon &&hIcon!=(HICON)-1){pDC->DrawIcon(10,10,hIcon);}DestroyIcon(hIcon);窗口自动靠边程序演示BOOL AdjustPos(CRect* lpRect){//自动靠边int iSX=GetSystemMetrics(SM_CXFULLSCREEN);int iSY=GetSystemMetrics(SM_CYFULLSCREEN);RECT rWorkArea;BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre a, 0);CRect rcWA;if(!bResult){//如果调用不成功就利用GetSystemMetrics获取屏幕面积rcWA=CRect(0,0,iSX,iSY);}elsercWA=rWorkArea;int iX=lpRect->left;int iY=lpRect->top;if(iX < rcWA.left + DETASTEP && iX!=rcWA.left){//调整左//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);lpRect->OffsetRect(rcWA.left-iX,0);AdjustPos(lpRect);return TRUE;}if(iY < rcWA.top + DETASTEP && iY!=rcWA.top){//调整上//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);lpRect->OffsetRect(0,rcWA.top-iY);AdjustPos(lpRect);return TRUE;}if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->W idth()){//调整右//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);lpRect->OffsetRect(rcWA.right-lpRect->right,0);AdjustPos(lpRect);return TRUE;}if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height()){//调整下//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);return TRUE;}return FALSE;}//然后在ONMOVEING事件中使用所下过程调用CRect r=*pRect;AdjustPos(&r);*pRect=(RECT)r;系统菜单添加菜单项给系统菜单添加一个菜单项需要进行下述三个步骤:首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。
visual studio 文件操作函数Visual Studio是一款功能强大的集成开发环境(Integrated Development Environment,简称IDE),广泛用于开发各种类型的应用程序。
在Visual Studio中,文件操作是开发过程中非常常见和重要的一部分。
本文将介绍一些常用的Visual Studio文件操作函数,帮助开发者更加高效地处理文件相关操作。
一、文件创建与打开1. `CreateFile`函数:用于创建或打开一个文件。
该函数可以指定文件名、访问权限、共享模式等参数,并返回一个表示文件句柄的值。
2. `fopen`函数:用于打开一个文件,并返回一个指向该文件的指针。
通过该指针,可以进行文件读写操作。
二、文件读写操作1. `ReadFile`函数:用于从文件中读取数据。
该函数可以指定文件句柄、读取的字节数、读取数据的缓冲区等参数,并返回读取的字节数和读取结果。
2. `WriteFile`函数:用于向文件中写入数据。
该函数可以指定文件句柄、要写入的数据、写入的字节数等参数,并返回写入的字节数和写入结果。
3. `fgets`函数:用于从文件中读取一行数据。
该函数可以指定要读取的字节数、读取数据的缓冲区和文件指针,并返回指向读取数据的指针。
三、文件定位与指针操作1. `fseek`函数:用于定位文件指针的位置。
该函数可以指定文件指针、偏移量和起始位置,并返回定位结果。
2. `ftell`函数:用于获取文件指针的当前位置。
该函数可以指定文件指针,并返回当前位置的偏移量。
3. `rewind`函数:用于将文件指针重新定位到文件的起始位置。
该函数可以指定文件指针,并无返回值。
四、文件关闭与删除1. `fclose`函数:用于关闭一个已打开的文件。
该函数可以指定要关闭的文件指针,并返回关闭结果。
2. `remove`函数:用于删除一个文件。
该函数可以指定要删除的文件名,并返回删除结果。
VC操作Excel文件保存用VC对Excel文件进行写操作后,在程序结束前需要对一些对象进行收尾工作,如调用_Workbook:: Save()方法(该方法是Microsoft提供的供VC调用的对Excel文件操作的标准方法,在文件excel9.cp p或excel.cpp中定义)保存文件。
问题就出现在这里,若选取要保存的Excel文件以前不存在则程序创建一个同名的空Excel文件,对Exc el表的操作实际是对其同名副本的操作,Save()方法会触发一个"另存为"的对话框,需要覆盖原来同名的空Excel文件,否则写入Excel的数据会丢失。
若选取的Excel文件已经存在,则调用Save()方法不会触发"另存为"对话框,系统会自动保存写到Excel中的数据。
需要说明的是,在调用Save()前,已经调用过SetAlertBeforeOverwriting(FALSE)和SetDisplayAle rts(FALSE)关掉一些警告窗口了。
若调用SaveAs()方法,虽不会触发"另存为"对话框,但会出抛出“找不到成员”的错误,这时保存写好的Excel文件后并重新打开发现数据还是丢失。
想尽所有办法,可总无法去掉那个讨厌的"另存为"对话框,请各位大虾帮忙。
多谢了!SaveAs()是excelapp的方法吗。
xlApp.ActiveWorkbook.SaveAs "C:\excel.xls"xlApp.Quit我的没有问题。
如今Excel是越来越重要了,在我们自己开发的程序中不免要和Excel打交道了。
利用Automation技术,我们可以在不去了解数据库的情况下玩转Excel,而且你会发现一切竟如此轻松!好了,咱们开始吧,我不喜欢用长篇累牍的代码来故弄玄虚,所以下面的代码都是切中要害的片段,总体上是个连贯的过程,包括启动Excel,读取数据,写入数据,以及最后的关闭Excel,其中还包括了很多人感兴趣的合并单元格的处理。
VC操作Excel的方法(2007-01-05 21:18:45)分类:VC,VB,Matlab编程开发A: 从classwizard中add class处from type library,去office的安装目录下引入excel.exe(这是office 2003的选择,其他版本都是用olb文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着excel文件的一个个部分,常用的有这几个_application,workbooks,_workbook,worksheets,_worksheet,Range,它们分别代表不同的意义._application代表了EXCEL服务器,workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks), _workbook就是一个表,相当于MDI中的一个视窗, worksheets表示所有的表单,每个表都可能有很多表单(建立一个Excel文件之后,打开,可以看到有sheet1,sheet2等,所有这些sheetn就组成了worksheets), _worksheet就表示一个表单, range表示元素的集合. 搞清楚上面这几个名词的意思非常重要.B,在dlg.h中声明下面几个变量:_Application exlapp; //组件服务器的各个classes_Workbook wbk;Workbooks wbks;_Worksheet wht;Worksheets whts;LPDISPATCH lpDisp;并在app.cpp的InitInstance方法中加入下面两句AfxInitOle(); AfxEnableControlContainer(); C,这里我没有像上面一样完全用程序来生成一个Excel文件,而是在开始时就在当前目录下生成了一个Excel文件,在对话框上我设置了两个按钮,下面是"显示"按钮的代码://创建Excel服务器if(!exlapp.CreateDispatch("Excel.Application")){AfxMessageBox("无法启动Excel服务器!");return;}COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);exlapp.SetVisible(TRUE);//使Excel可见exlapp.SetUserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝.//Open an excel filechar path[MAX_PATH];GetCurrentDirectory(MAX_PA TH,path);CString strPath = path;strPath += "\\VCOpExcel";wbks.AttachDispatch(exlapp.GetWorkbooks());lpDisp=wbks.Open(strPath,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);wbks.ReleaseDispatch();exlapp.ReleaseDispatch();D,与上面第一种方法一样,可以插入记录:UpdateData(); //读入数据if (""==m_name) //判断名字输入有效{MessageBox("Please input a right name");return;}if (0>=m_age||100<=m_age) //判断年龄输入有效{MessageBox("Please input a right age");return;}char *p=strupr(_strdup(m_gener));if (strcmp(p,"FEMALE")&&strcmp(p,"MALE")) //判断性别输入有效 {MessageBox("Please input a right gener");return;}Range range;Range usedRange;COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);if(!exlapp.CreateDispatch("Excel.Application")) //启动服务器{AfxMessageBox("无法启动Excel服务器!");return;}char path[MAX_PATH];GetCurrentDirectory(MAX_PA TH,path);CString strPath = path;strPath += "\\VCOpExcel";wbks.AttachDispatch(exlapp.GetWorkbooks());lpDisp=wbks.Open(strPath, //初始化.avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar); wbk.AttachDispatch(lpDisp);whts.AttachDispatch(wbk.GetWorksheets());lpDisp=wbk.GetActiveSheet();wht.AttachDispatch(lpDisp);usedRange.AttachDispatch(wht.GetUsedRange());range.AttachDispatch(usedRange.GetRows());long iRowNum=range.GetCount();//已经使用的行数range.AttachDispatch(wht.GetCells());range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(1)),COleVariant(m_name)); range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(2)),COleVariant(m_age));range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(3)),COleVariant(m_gener));wbk.Save();wbk.Close(avar,COleVariant(strPath),avar);wbks.Close();exlapp.Quit();(完)分享到新浪微博阅读(802)|评论(2)|收藏(0)|打印|举报前一篇:结婚流程(转)后一篇:vc excel 操作补充评论重要提示:警惕虚假中奖信息,点击查看详情免费任选1000款游戏新手卡[发评论]你好:2007-01-11 12:30:31我参考你的文章做了一下关于excel的操作但是执行if(!ExcelApp.CreateDispatch("Excel.Application",NULL)){AfxmessageBox("创建Excel服务失败");exit(1);}总是失败。
VC删除⽂件或⽂件夹内容1.删除指定⽂件第⼀种⽅法:定义⼀个⽂件类对象来操作CFile TempFile;TempFile.Remove(指定⽂件名);第⼆种⽅法:DeleteFile("c:\\abc\\test.exe ");//MFC框架中可直接调⽤此函数2.删除⽬录_rmdir()DeleteDirectory(sTempDir)RemoveDirectory(sTempDir)//删除⽂件夹⽬录(⾮空)⽅法⼀ bool DeleteDirectory( CString DirName){AfxMessageBox("执⾏删除⽂件夹:"+DirName);CString PUBPATH;PUBPATH=DirName;CFileFind tempFind;DirName+="\\*.*";BOOL IsFinded=(BOOL)tempFind.FindFile(DirName);while(IsFinded){IsFinded=(BOOL)tempFind.FindNextFile();if(!tempFind.IsDots()){CString strDirName;strDirName+=PUBPATH;strDirName+="\\";strDirName+=tempFind.GetFileName();AfxMessageBox("strDirName :"+strDirName);if(tempFind.IsDirectory()){//strDirName += PUBPATH;DeleteDirectory(strDirName);}else{SetFileAttributes(strDirName,FILE_ATTRIBUTE_NORMAL); //去掉⽂件的系统和隐藏属性DeleteFile(strDirName);}}}tempFind.Close();if(!RemoveDirectory(PUBPATH)){return false ;}AfxMessageBox("⽂件夹删除成功...");return true;}⽅法⼆bool DeleteDirectory( char* DirName){HANDLE hFirstFile = NULL;WIN32_FIND_DATA FindData;char currdir[MAX_PATH] = {0};sprintf(currdir, "%s\\*.*", DirName);hFirstFile = ::FindFirstFile(currdir, &FindData);if( hFirstFile == INVALID_HANDLE_VALUE )return false;BOOL bRes = true;while(bRes){bRes = ::FindNextFile(hFirstFile, &FindData);if( (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) //发现⽬录{if( !strcmp(FindData.cFileName, ".") || !strcmp(FindData.cFileName, "..") ) //.或.. continue;else{char tmppath[MAX_PATH] = {0};sprintf(tmppath, "%s\\%s", DirName, FindData.cFileName); DeleteDirectory(tmppath);}}else //发现⽂件{char tmppath[MAX_PATH] = {0};sprintf(tmppath, "%s\\%s", DirName, FindData.cFileName);::DeleteFile(tmppath);}}::FindClose(hFirstFile);if(!RemoveDirectory(DirName)){return false ;}return true;}。
CFile和CStdioFile的文件读写使用方法(2009-08-18 10:35:01)标签:杂谈CFile//创建/打开文件CFile file;file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead Write);文件打开模式可组合使用,用“|”隔开,常用的有以下几种:CFile::modeCreate:以新建方式打开,如果文件不存在,新建;如果文件已存在,把该文件长度置零,即清除文件原有内容。
CFile::modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常。
一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件;存在就进行追加操作。
CFile::modeReadWrite:以读写方式打开文件。
CFile::modeRead:只读。
CFile::modeWrite:只写。
//写入数据CString strValue = "Hello World!";file.Write(strValue,strValue.GetLength());//追加数据file.SeekToEnd(); //将指针移至文件末尾进行追加file.Write(strValue,strValue.GetLength());//关闭文件file.Close();CStdioFileCStdioFile是CFile的派生类,对文件进行流式操作,对于文本文件的读写很有用处,可按行读取写入。
//写入数据CString strValue = "Hello World!";file.WriteString(strValue);//读取数据CString strRead;file.ReadString(strRead);当文件存在多行数据需要逐行读取时,可用函数BOOL CStdioFile::ReadString(CString& rString),当遇到"\n "时读取截断,如果文件未读完,返回true,否则返回false。
VC++操作及常见问题解决方法一VC++有关操作方法:1整理代码:选上所有较乱的代码,同时按下Alt加F8键即可.2图形界面与命令提示符界面数据的复制方法:在图形界面按Ctrl+C,在命令提示符界面点击右键->粘贴即可.3VC编程时不显示提示信息(类的成员和参数列表)解决:1).菜单-->工具(Tools)-->选项(Options)-->编辑器(Editor)-->语句完成选项(Statement completion options)--->勾选自动列出成员(Auto list members)。
2).关闭工程-->把工程下的.ncb(VC++ Intellisense Database)文件删除-->再重新打开工程即可。
3).安装Visual AssistX插件(下载地址/detail/wentasy/4010401)4切换工程:工具栏空白处点右键->选取组件(取消初使选取的是编译微型条)->通过VC编译器的下拉列表可切换工程.链接库文件:工程->设置->连接->对象/库模块(移到最后)->输入相应库文件->确定5增加消息处理器:1)右键ClassView的类名->选Add Windows Message Handler->选WM_...->选Add Handler->选EditExisting;2)点VC++的菜单查看->选建立类向导->选工程->选类名->选消息->选Add Function->选Edit Code.3)先双击类名在头文件的DECLARE_MESSAGE_MAP()前的注释宏间加入消息响应原型声明,然后双击构造函数名在源文件中的BEGIN_MESSAGE_MAPHE和END_MESSAGE_MAP间的注释宏间加入消息响应函数的宏,最后在源文件中实现.6.windowsAPI程序引用C++类(如error C2065: 'CString' : undeclared identifier错误)的方法:包含<Afx.h>头文件(不要<windows.h>);定义预处理器(工程->设置->C/C++->预处理器定义:_AFXDLL);选择多线程(工程->设置->C/C++->CodeGeneration->Use run-time library->Multithread DLL).7.删除消息处理函数及相关信息:右键函数名->Delete->是.8.使用多线程的C run-time library(用MFC时也要使用多线程): 编译多线程程序时提示error C2065: '_beginthread' : undeclared identifier 解决方法是:debug状态:settings-> C/C++-> Project Options中加入/MDdrelease状态:settings-> C/C++-> Project Options中加入/MD.9.链接库文件的方法:1) 使用#pragma comment(lib,"MyDll.lib")语句;2) 在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。
vc文件操作在VC编程中,操作文件的方法主要有两种:利用API函数和MFC的CFile类。
微软在其中封装了文件的一般操作,下面我就介绍一下如何利用这两种方法实现文件操作。
1.创建或打开一个文件API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。
HANDLE CreateFile(LPCTSTR lpFileName, // 要打开的文件名DWORD dwDesiredAccess, // 文件的操作属性DWORD dwShareMode, // 文件共享属性LPSECURITY_ATTRIBUTES lpSecurityAttributes,// 文件安全特性DWORD dwCreationDisposition, //文件操作DWORD dwFlagsAndAttributes, // 文件属性HANDLE hTemplateFile // 如果不为零,则指定一个文件句柄。
新文件将从这个文件中复制扩展属性);文件的操作属性:如果为零,表示只允许获取与一个设备有关的信息,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函数。
文件关闭用:BOOL CloseHandle(HANDLE hObject // handle to object to close);例子1、在当前目录下面创建一个文件:HANDLE handle;DWORD Num;handle= ::CreateFile("new.tmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_AL WAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);if(INVALID_HANDLE_VALUE!= handle ){::SetFilePointer(handle,0,0,FILE_BEGIN);char Buffer[] = "这是个刚创建的文件";::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( LPCTSTR lpszFileName, UINT nOpenFlags );throw( CFileException );CFile( );BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, 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{CFile f( pFileName, CFile::modeCreate | CFile::modeWrite );}CATCH( CFileException, e ){#ifdef _DEBUGafxDump << "File could not be opened " << e->m_cause << "\n";#endif}END_CATCHCFile fileTest;char* pFileName = "test.dat";TRY{fileTest.Open(pFileName, CFile::modeCreate |CFile::modeWrite);}CATCH_ALL(e){fileTest.Abort( );THROW_LAST ( );}END_CATCH_ALL2.文件的读写定位定位文件中的数据是很重要的,这决定了写入的数据在文件中的位置。
API函数DWORD SetFilePointer(HANDLE hFile, //文件的句柄LONG lDistanceToMove, //字节偏移量rPLONG lpDistanceToMoveHigh, //指定一个长整数变量,其中包含了要使用的一个高双字偏移(一般用来操作大型文件)。
可设为零,表示只使用lDistanceToMoveDWORD dwMoveMethod //文件定位);dwMoveMethod文件定位的方式有三种:·FILE_BEGIN:从文件开始处。
·FILE_CURRENT:从当前位置。
·FILE_END:从文件的末尾。
此函数可以用来定位大型文件,lpDistanceToMoveHigh是高32位,lDistanceToMove 是低32位。
如果lpDistanceToMoveHigh为NULL时,函数操作成功,返回的是当前文件数据的偏移量,如果lpDistanceT oMoveHigh不NULL,则返回数据的偏移量高32位放在lpDistanceToMoveHigh中,函数调用失败返回的是0xffffffff.BOOL SetEndOfFile(HANDLE hFile //文件的句柄);CFile类的文件数据定位函数有:LONG Seek(LONG lOff,UINT nFrom);throw(CFileException);如果要求的位置合法,则Seek返回从文件开始起的新字节偏移量lOff:指针移动的字节数。