PC端文件及目录的管理总结

来源:互联网 发布:启明教育软件下载 编辑:程序博客网 时间:2024/05/16 18:16

 最近一个项目要处理的是PC机上文件及目录的管理。无非就是文件的新建、删除、拷贝、剪切、粘贴、移动、更名,目录的创建、删除、拷贝、剪切、粘贴、移动、更名操作。主要设计文件和目录两个对象,每个对象包含对应的方法。

一、文件

        新建:创建一个由客户输入带文件扩展名的文件;删除:直接删除鼠标选中的文件;拷贝:将选中文件的路径拷贝到剪贴板中,附加一个拷贝标志;剪切:将选中的文件路径拷贝到剪贴板中,附加一个剪切标志;粘贴:将剪贴板中文件路径的文件粘贴到当前路径,并根据拷贝或剪切标志决定是否删除源文件;移动:和剪切一个文件类似,不过可能是直接操作目录链接的方式;更名:直接更改文件名称;

二、目录

        创建:创建一个客户输入名称的文件夹;删除:先删除目录中的所有文件,如果还有子目录则先递归到最下级子目录,删除子目录中的所有文件,然后一级一级回到主目录,最后删除该空目录;拷贝:将选中目录的路径拷贝到剪贴板中,附加一个拷贝标志;剪切:将选中的目录路径拷贝到剪贴板中,附加一个剪切标志;粘贴:将剪贴板中的目录路径粘贴到当前路径,并根据拷贝或剪切标志决定是否删除源目录,如果要删除源目录和删除目录处理过程一致;移动:更改目录的链接路径;更名:直接更改目录名称;

拷贝文件和目录代码:

void   CopyAllFileAndFolder(CString   strDest)   
{   
    ::CreateDirectory((LPCTSTR)strDest,NULL);   
    
    WIN32_FIND_DATA   wfd;   
    HANDLE   hFile
=::FindFirstFile(_T("*.*"),&wfd);   
    
if(hFile!=INVALID_HANDLE_VALUE)   
    
{   
        
do   
        
{   
          CString   strFileName
=wfd.cFileName;   
          
if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)   
          
{   
                  CString   strFolderName
=wfd.cFileName;   
                  
if(strFolderName!=_T(".")&&strFolderName!=_T(".."))   
                  
{   
              ::SetCurrentDirectory(wfd.cFileName);   
              CopyAllFileAndFolder(strDest
+_T("/"+strFolderName);   
              ::SetCurrentDirectory(_T(
".."));   
                  }
   
          }
   
          
else   
          
{   
                      ::CopyFile(wfd.cFileName,strDest
+_T("/")+strFileName,FALSE);   
          }
   
        }
while(::FindNextFile(hFile,&wfd));   
        ::FindClose(hFile);   
    }
   
}

另外一种是调用CopyFile函数

CopyFile  
  语法:CopyFile   (szSrcFile,   szTargetFile);  
  说明:CopyFile函数创建一个由参数szSrcFile指定的文件的拷贝。新文件由参数szTargetFile指定文件名。  
  参数:  
  szSrcFile  
  指定要拷贝的文件的文件名。如果该文件名是限定的,也就是,如果它包括一个路径,CopyFile将从指定位置拷贝该文件。如果szSrcFile包含一个未限定文件名,也就是,没有路径信息,CopyFile将从由系统变量SRCDIR标识的路径拷贝。为拷贝一组文件,在该参数位置使用通配符。  
  szTargetFile  
  指定给由szSrcFile标识的文件的拷贝的名称。如果文件名是限定的,也就是,如果它包含一个路径,CopyFile将把文件拷贝到路径指定的位置。如果szSrcFile包含一个未限定文件名,也就是,没有路径信息,拷贝将被创建在由系统变量TARGETDIR指定的目录中。如果目标目录不存在,它将被创建。  
          当由szSrcFile指定的文件名中包含一个通配符时,szTargetFile的文件名部分被忽略;每个源文件以它的现存名被拷贝到由szTargetFile指定的路径。如果szTargetFile包含一个未限定文件名,文件将被拷贝到由系统变量TARGETDIR指定的目录中。因此,CopyFile不能被用来拷贝和重命名一组文件。当szSrcFile包含一个或多个通配符时,源目录和目标目录必须不同。  
  返回值:  
  0:表明函数成功地从源目录拷贝文件至目标目录。  
  <   0:表明函数因下列情况之一未能拷贝所要文件:  
  COPY_ERR_CREATEDIR   (-27):目标目录不能被创建。确保系统变量TARGETDIR中的路径语法正确并且你有权访问目标驱动器。  
  COPY_ERR_MEMORY   (-6):函数未能分配完成拷贝文件进程所需的内存。尽可能多地终止正在运行的应用程序以释放内存。  
  COPY_ERR_NODISKSPACE   (-38):函数未能在目标驱动器上找到足够的磁盘空间来拷贝文件。在目标驱动器上释放磁盘空间。  
  COPY_ERR_OPENINPUT   (-2):函数未能打开系统变量SRCDIR指定的输入文件。确保源文件有一个有效的文件名并且源文件和目标目录都存在。  
  COPY_ERR_OPENOUTPUT   (-3):函数未能拷贝所要文件。  
  COPY_ERR_TARGETREADONLY   (-46):TARGETDIR中的文件是只读文件。删除目标文件的只读属性并重试。  
  所有其它负值:表明发生一些其它不确定错误。  
  注解:  
  ·如果你使用未限定文件名并在使用CopyFile时设置SRCDIR和   TARGETDIR的值,在调用CopyFile前用VarSave保存当前值并然后用VarRestore重新设置。如果目标目录不存在,CopyFile创建它。  
  ·你不能通过调用CopyFile时使用通配符来重命名一组文件。然而,单独一个文件时你可以使用CopyFile来做到。  
  ·为包括子目录,调用XcopyFile函数。  
  ·对于文件传输,XCopyFile   是CopyFile的一个完美替换。XCopyFile可以做版本检测,标记锁定的.dll和.exe文件待系统重启后更新,并且递增共享的.dll和.exe文件的注册表访问计数器。  
  ·因为Windows   95及更高版本不允许一个空文件被拷贝,Windows   NT不允许创建空文件,CopyFile在这些平台下当被用来拷贝空文件(Size=0KB)时将不工作。  
  ·   在用WriteProfString   或   WriteProfInt修改.ini文件后,   Windows   95及更高版本下,你必须在使用CopyFile前刷新高速缓存。所有.ini文件在Windows   95及更高版本下被放在高速缓存中;这种特性可能导致延迟将修改写到指定文件。这接着可能妨碍随后的文件操作。为避免这个问题,简单地以空参数调用WriteProfString来强制Windows   95   及更高版本立即写数据到.ini文件,如下所示:  
          WriteProfString   ("C://Test.ini",   "Windows",   "KeyboardDelay",   "100");  
          file://null   string   ("")   for   all   four   parameters  
          WriteProfString   ("",   "",   "",   "");    
          file://CopyFile   should   now   have   access   to   updated   file.  
          CopyFile   ("C://Test.ini",   "C://Temp//Test.ini");

对文件名更名

CFile   f;   
CFileException   e;   
if(   !f.Open(fd,   CFile::modeWrite|CFile::modeRead,   &e   )     
       
{   
#ifdef   _DEBUG   
       afxDump   
<<   "File   could   not   be   opened   "   <<   e.m_cause   <<   " ";   
#endif   
}
   
f.Close();   
try   
{   
        f.Rename(m_filearray[fnum].filename,m_filearray[fnum].status);   
}
   
    
catch(CFileException*   pEx   )   
{   
#ifdef   _DEBUG   
    
if(pEx->m_cause==CFileException::sharingViolation)   
    
{   
        MessageBox(
"the   sharingViolation");   
    }
   
        afxDump   
<<   "File   "   <<   m_filearray[fnum].filename   <<   "   not   found,   cause   =   "<<   pEx->m_cause   <<   " ";   
#endif   
        pEx
->Delete();   
}
   

另用rename也能对文件和目录进行重命名。

目录管理:

1。创建目录:   
  BOOL   CreateDirectory(   
          LPCTSTR   lpPathName, 
//   pointer   to   a   directory   path   string   
          LPSECURITY_ATTRIBUTES   lpSecurityAttributes   
        );   
2。目录改名:   
BOOL   MoveFile(   
          LPCTSTR   lpExistingFileName, 
//   address   of   name   of   the   existing   file       
          LPCTSTR   lpNewFileName   //   address   of   new   name   for   the   file     
        );   
  但MoveFile不能跨驱动器更改目录名。
删除目录一:
删除目录及目录下所有文件
BOOL DeleteDirectory(
char *DirName)
{
    CFileFind tempFind;
    
char tempFileFind[200];
    sprintf(tempFileFind,
"%s/*.*",DirName);
    BOOL IsFinded
=(BOOL)tempFind.FindFile(tempFileFind);
    
while(IsFinded)
   
{
       IsFinded
=(BOOL)tempFind.FindNextFile();
       
if(!tempFind.IsDots())
       
{
             
char foundFileName[200];
             strcpy(foundFileName,tempFind.GetFileName().GetBuffer(
200));
             
if(tempFind.IsDirectory())
             
{
                   
char tempDir[200];
                   sprintf(tempDir,
"%s/%s",DirName,foundFileName);
                   DeleteDirectory(tempDir);
              }

              
else
             
{
                   
char tempFileName[200];
                   sprintf(tempFileName,
"%s/%s",DirName,foundFileName);
                   DeleteFile(tempFileName);
              }

         }

   }

   tempFind.Close();
   
if(!RemovwDirctory(DirName))
  
{
       MessageBox(
0,"删除目录失败!","警告信息",MK_OK);
       
return FALSE;
   }

   
return TRUE;
}
删除目录二:
//   删除目录   
void   DeleteDirectory(CString   strDir)   
{   
    
if(strDir.IsEmpty())
    
{   
        RemoveDirectory(strDir);   
        
return;   
    }
   
    
//   首先删除文件及子文件夹   
    CFileFind   ff;   
    BOOL   bFound   
=   ff.FindFile(strDir+"/*",   0);   
    
while(bFound)   
    
{   
        bFound   
=   ff.FindNextFile();   
        
if(ff.GetFileName()=="."||ff.GetFileName()=="..")   
            
continue;   
        
//   去掉文件(夹)只读等属性   
        SetFileAttributes(ff.GetFilePath(),   FILE_ATTRIBUTE_NORMAL);   
        
if(ff.IsDirectory())   
        
{   //   递归删除子文件夹   
            DeleteDirectory(ff.GetFilePath());   
            RemoveDirectory(ff.GetFilePath());   
        }
   
        
else   {   
            DeleteFile(ff.GetFilePath());   
//   删除文件   
        }
   
    }
   
    ff.Close();   
    
//   然后删除该文件夹   
    RemoveDirectory(strDir);   
}
另有人说用下面的更好,不过我没有用过。暂且列在这里:
//可以删除有子目录的目录,最省事
int   SHFileOperation(LPSHFILEOPSTRUCT   lpFileOp);   
原创粉丝点击