VC++的文件操作

来源:互联网 发布:淘宝店虚假交易警告 编辑:程序博客网 时间:2024/06/06 17:05

文件打开:
char* pszFileName = "c:\\test\\myfile.dat";
CFile myFile;
CFileException fileException;
if ( !myFile.Open( pszFileName, CFile::modeCreate | CFile::modeReadWrite, &fileException ) )
{
    TRACE( "Can't open file %s, error = %u\n",
       pszFileName, fileException.m_cause );
}

文件读写:
char      szBuffer[256]; 
UINT      nActual = 0; 
CFile myFile;
myFile.Write( szBuffer, sizeof( szBuffer ) ); 
myFile.Seek( 0, CFile::begin );
nActual = myFile.Read( szBuffer, sizeof( szBuffer ) );

文件关闭:
myFile.Close();

文件定位:
long offset = 1000;     // 偏移量
long cpos;              // 当前位置
cpos = myFile.Seek(offset,CFile::begin);
结果是cpos的值为1000

文件的查找 
  当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。 
  CString strFileTitle; 
  CFileFind finder; 
  BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab"); 
  while(bWorking) 
  { 
  bWorking=finder.FindNextFile(); 
  strFileTitle=finder.GetFileTitle(); 
  } 

  如果你要进行的文件操作只是简单的读写整行的字符串,我建议你使用CStdioFile,用它来进行此类操作非常方便,如下例。 
  CStdioFile mFile; 
  CFileException mExcept; 
  mFile.Open( "d:\\temp\\aa.bat", CFile::modeWrite, &mExcept); 
  CString string="I am a string."; 
  mFile.WriteString(string); 
   mFile.Close();

移动一个文件,一般可使用:
BOOL WINAPI MoveFile(LPCSTR Existing, LPCSTR Target);
其中 Existing是现有文件或目录,Target是目标文件或目录。此函数还可以用来对文件改名。例:
MoveFile("D:\\Temp\\a.txt", "E:\\MyPath\\b.txt"); 将D:\Temp\a.txt移动到E:\MyPath并改名为b.txt

>API中的CopyFile:
BOOL WINAPI CopyFile(LPCSTR oldFileName, LPCSTR newFileName, BOOL failIfExists);
oldFileName: 原始文件名;
newFileName: 目标文件名;
failIfExists: 目标文件已存在时的处理办法。TRUE则不覆盖并返回失败标记,FALSE则覆盖。
返回值:TRUE代表成功,FALSE代表失败。

>粘贴又是哪个函数呢?
粘贴的功能不是一个函数能够实现的.对剪贴板的操作Windows有一系列函数.粘贴必须要用的是 OpenClipboard(), GetCipboardData()和CloseClipboard().
拷贝-粘贴的对象为文本或其他二进数据(如图像)时可能还要辅助其他的API.

在不使用mfc的程序中获得某个目录下的所有文件名称,包括子目录。把文件名称以一个固定的程度放入一个缓冲中,这个缓冲要足够的大,能容下所有的文件名称。

函数的输入为要查找的根目录,输出为存放所有文件名称的缓冲

void FindFileInDir(char* rootDir, char* strRet)

{

    char fname[MAC_FILENAMELENOPATH];

    ZeroMemory(fname, MAC_FILENAMELENOPATH);


    WIN32_FIND_DATA fd;

    ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));

    HANDLE hSearch;

    char filePathName[256];

    char tmpPath[256];

    ZeroMemory(filePathName, 256);

    ZeroMemory(tmpPath, 256);

    strcpy(filePathName, rootDir);

    BOOL bSearchFinished = FALSE;

    if( filePathName[strlen(filePathName) -1] != '\\' )

    {

       strcat(filePathName, "\\");

    }

    strcat(filePathName, "*");

    hSearch = FindFirstFile(filePathName, &fd);

    //Is directory

    if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

       && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )      

    {

       strcpy(tmpPath, rootDir);

       strcat(tmpPath, fd.cFileName);

       FindFileInDir(tmpPath, strRet);

    }

   

    else   if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )

              {

                  sprintf(fname, "%-50.50s", fd.cFileName);

                  strcat(strRet + strRet[strlen(strRet)] , fname);

              }

    while( !bSearchFinished )

    {

       if( FindNextFile(hSearch, &fd) )

       {

           if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )      

           {

              strcpy(tmpPath, rootDir);

              strcat(tmpPath, fd.cFileName);

              FindFileInDir(tmpPath, strRet);

           }

   

           else   if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )

                     {

                         sprintf(fname, "%-50.50s", fd.cFileName);

                         strcat(strRet + strRet[strlen(strRet)] , fname);

                     }

       }

       else

       {

           if( GetLastError() == ERROR_NO_MORE_FILES )          //Normal Finished

           {

              bSearchFinished = TRUE;

           }

           else

              bSearchFinished = TRUE;     //Terminate Search

       }

    }

    FindClose(hSearch);

}

 

C++中文件操作时,可以使用MFC的CFile类中的Remove()函数来删除一个文件,但是这样的操作将永久性的删除该文件,不能在必要的时候再恢复该文件,解决这个问题的唯一方法就是把文件送到Windows系统中的回收站(Recycle Bin)里面,而不是简单的永久性删除它,这样用户就可以在必要的时候恢复这个文件。这个例子就来说明如何实现编程来实现Windows回收站的文件存取操作。

  一、实现方法

  在Windows的shellapi文件中,定义了一个名为SHFileOperation()的外壳函数,用它可以实现各种常规文件操作,如文件的拷贝、删除、移动等,该函数使用起来非常简单,它只有一个指向SHFILEOPSTRUCT结构的参数。使用SHFileOperation()函数时只要填写该专用结构--SHFILEOPSTRUCT,告诉Windows执行什么样的操作,以及其它重要信息就行了。SHFileOperation()的特别之处在于它是一个高级外壳函数,不同于低级文件处理。当调用SHFileOperation操作文件时,相应的外壳拷贝处理器(如果有的话)被调用。如在删除某个文件时,SHFileOperation会将删除的文件放到Recycle Bin中。SHFileOperation()函数的原形为:

WINSHELLAPI int WINAPI SHFileOperation (LPSHFILEOPSTRUCT lpFIleOp);

  函数中参数类型为一个LPSHFILEOPSTRUCT结构,它包含有进行文件操作的各种信息,其具体的结构如下:

Typedef struct _ShFILEOPSTRUCT 
{
HWND hWnd;                       //消息发送的窗口句柄;
UINT wFunc;                      //操作类型
LPCSTR pFrom;                    //源文件及路径
LPCSTR pTo;                      //目标文件及路径
FILEOP_FLAGS fFlags;             //操作与确认标志
BOOL fAnyOperationsAborted;      //操作选择位
LPVOID hNameMappings;            //文件映射
LPCSTR lpszProgressTitle;        //文件操作进度窗口标题
}SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;

  在这个结构中,hWnd是指向发送消息的窗口句柄,pFrom与pTo是进行文件操作的源文件名和目标文件名,它包含文件的路径,对应单个文件的路径字符串,或对于多个文件,必须以NULL作为字符串的结尾或文件路径名之间的间隔,否则在程序运行的时候会发生错误。另外,pFrom和pTo都支持通配符*和?,这大大方便了开发人员的使用。例如,源文件或目录有两个,则应是:char pFrom[]="d:\\Test1\0d:\\Text.txt\0",它表示对要D:盘Test目录下的所有文件和D:盘上的Text.txt文件进行操作。字符串中的"\\"是C语言中的'\'的转义符,'\0'则是NULL。wFunc 是结构中的一个非常重要的成员,它代表着函数将要进行的操作类型,它的取值为如下:

  FO_COPY: 拷贝文件pFrom到pTo 的指定位置。

  FO_RENAME: 将pFrom的文件名更名为pTo的文件名。

  FO_MOVE: 将pFrom的文件移动到pTo的地方。

  FO_DELETE: 删除pFrom指定的文件。

  使用该函数进行文件拷贝、移动或删除时,如果需要的时间很长,则程序会自动在进行的过程中出现一个无模式的对话框(Windows操作系统提供的文件操作对话框,跟我们用资源管理器操作时类似),用来显示执行的进度和执行的时间,以及正在拷贝、移动或删除的文件名,此时结构中的成员lpszProgressTitle显示此对话框的标题。fFlags是在进行文件操作时的过程和状态控制标识。它主要有如下一些标识,也可以是其组合:

  FOF_FILESONLY:执行通配符,只执行文件;

  FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢复文件;

  FOF_NOCONFIRMATION:在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。

  FOF_NOERRORUI:设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。

  FOF_RENAMEONCOLLISION:当已存在文件名时,对其进行更换文提示。

  FOF_SILENT:不显示进度对话框。

  FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函数返回正处于操作状态的实际文件列表,文件列表名柄保存在hNameMappings成员中。

  SHFILEOPSTRUCT结构还包含一个SHNAMEMAPPING结构的数组,此数组保存由SHELL计算的每个处于操作状态的文件的新旧路径。

  在使用该函数删除文件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的文件拷到Recycle Bin,从而使用户可以撤销删除操作。需要注意的是,如果pFrom设置为某个文件名,用FO_DELETE标志删除这个文件并不会将它移到Recycle Bin,甚至设置FOF_ALLOWUNDO标志也不行,在这里你必须使用全路径名,这样SHFileOperation才会将删除的文件移到Recycle Bin。

  二、编程步骤

  1、 启动Visual C++6.0,生成一个单文档视图的项目FileDelete;

  2、为项目添加一个菜单ID_FileDelete,然后用Visual C++的Class Wizard为其在视图类新增消息处理函数OnFileDelete();

  3、添加代码,编译运行程序;

  三、程序代码

///////////////////////////////////////////////////////////////////////
void CFileOperationView::OnFileDelete()
{
 int nOk;
 char strSrc[]="d:\\Vb\0";//源文件路径;
 char strDst[]="d:\\Vb1\0";//目标文件路径;
 char strTitle[]="文件拷贝"; //文件删除进度对话框标题
 SHFILEOPSTRUCT FileOp;//定义SHFILEOPSTRUCT结构对象;
 FileOp.hwnd=this->m_hWnd;
 FileOp.wFunc=FO_DELETE; //执行文件删除操作;
 FileOp.pFrom=strSrc;
 FileOp.pTo=strDst;
 FileOp.fFlags=FOF_ALLOWUNDO;//此标志使删除文件备份到Windows回收站
 FileOp.hNameMappings=NULL;
 FileOp.lpszProgressTitle=strTitle;
 //这里开始删除文件
 nOk=SHFileOperation(&FileOp);
 if(nOk)
  TRACE("There is an error: %d\n",nOk);
 else
  TRACE("SHFileOperation finished successfully\n");
}

 

转自:http://hi.baidu.com/solomon335/item/c25362418a9ddb17886d1020
原创粉丝点击