文件和目录

#include
#include
#include
#include 
//////////////////////////////////////////////////////////////////////////
//判断目录或文件是否存在
bool IsFileDirExist(string path)
{
 if(_access(path.c_str(),0)!=-1)
 {
  //cout<<path.c_str()<<" exist!"<<endl;
  return true;
 }
 else
  return false;
}


////////////////////////////////////////////////////////////////////////////////////////
//说明:
//[1] windows下 参数为 "" 或 / 获得的目录是当前的盘符
//[2] 绝对路径中的/可以多个重复,windows识别为一个/ ;
//    如: DeleteFile("F://///here/////file.txt");等同于DeleteFile("F://here//file.txt");
//[3] 该函数删除指定目录下的所有文件,不递归删除子文件夹的内容
////////////////////////////////////////////////////////////////////////////////////////
bool DeleteFileInDir(string rootDir)
{  
 if (strcmp(rootDir.c_str(),"")==0
  ||strcmp(rootDir.c_str(),"//")==0) {
  cout<<"非法路径!"<<endl;
  return false;
 }
    WIN32_FIND_DATA fd;
    ZeroMemory(&fd, sizeof(WIN32_FIND_DATA)); 
 
    HANDLE hSearch; 
    string filePathName; 
    string tmpPath;  
 
    filePathName=rootDir;
 
    BOOL bSearchFinished = FALSE;
 
    if( filePathName.data()[filePathName.length()-1] != '//' )  
    {  
  filePathName+="//"; 
    }  
 
    filePathName+="*";
 
    hSearch = FindFirstFile(filePathName.c_str(), &fd);

 if (hSearch==INVALID_HANDLE_VALUE) {
  cout<<"Directory or file name is invalid!"<<endl;
  return false;
 }
 
    while( !bSearchFinished )  
    {  
  if( FindNextFile(hSearch, &fd) )   
  {   
   if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    
    && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )     
   { 
    tmpPath = rootDir;
    tmpPath+=fd.cFileName;
    cout<<tmpPath.c_str()<< " is a directory! Not deleted."<<endl;
   }    
   else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )    
   {
    tmpPath = rootDir;
    if (tmpPath.data()[tmpPath.length()-1]!='//') {
     tmpPath+="//";
    }
    tmpPath+=fd.cFileName;
    if (hSearch==INVALID_HANDLE_VALUE) {
     cout<<"Directory or file name is invalid!"<<endl;
     return false;
    }    
    if(DeleteFile(tmpPath.c_str()))
    {
     cout<<"File "<<tmpPath.c_str()<<" is deleted!"<<endl;
    }
    else
    {
     cout<<"File "<<tmpPath.c_str()<<" is not deleted!"<<endl;
     return false;
    }
   }   
  }  
  else   
  {   
   if( GetLastError() == ERROR_NO_MORE_FILES )          //Normal Finished    
   {    
    bSearchFinished = TRUE;    
   }
   else    
    bSearchFinished = TRUE;     //Terminate Search   
  }  
    } 
    FindClose(hSearch);
 return true;
}


////////////////////////////////////////////////////////////////////////////////////////
//说明:
//[1] windows下 参数为 "" 或 / 获得的目录是当前的盘符
//[2] 绝对路径中的/可以多个重复,windows识别为一个/ ;
//    如: DeleteFile("F://///here/////file.txt");等同于DeleteFile("F://here//file.txt");
//[3] 该函数删除指定目录下的所有文件,并递归删除子文件夹的内容
////////////////////////////////////////////////////////////////////////////////////////
bool DeleteFileDir(string rootDir)
{  
 if (strcmp(rootDir.c_str(),"")==0
  ||strcmp(rootDir.c_str(),"//")==0) {
  cout<<"非法路径!"<<endl;
  return false;
 }
    WIN32_FIND_DATA fd;
    ZeroMemory(&fd, sizeof(WIN32_FIND_DATA)); 
 
    HANDLE hSearch; 
    string filePathName; 
    string tmpPath;  
 
    filePathName=rootDir;
 
    BOOL bSearchFinished = FALSE;
 
    if( filePathName.data()[filePathName.length()-1] != '//' )  
    {  
  filePathName+="//"; 
    }  
 
    filePathName+="*";
 
    hSearch = FindFirstFile(filePathName.c_str(), &fd);
 
 if (hSearch==INVALID_HANDLE_VALUE) {
  cout<<"Directory or file name is invalid!"<<endl;
  return false;
 }
 
    while( !bSearchFinished )  
    {  
  if( FindNextFile(hSearch, &fd) )   
  {   
   if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    
    && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )     
   { 
    tmpPath = rootDir;
    tmpPath+=fd.cFileName;
    //cout<<tmpPath.c_str()<< " is a directory! Not deleted."<<endl;
    if(!DeleteFileDir(tmpPath))
    {
     cout<<"Delete "<<tmpPath.c_str()<<" failed!"<<endl;
     return false;
    }
    if(rmdir(tmpPath.c_str())==0)
    {
     cout<<"Directory "<<tmpPath.c_str()<<" is deleted!"<<endl;
    }
   }    
   else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )    
   {
    tmpPath = rootDir;
    if (tmpPath.data()[tmpPath.length()-1]!='//') {
     tmpPath+="//";
    }
    tmpPath+=fd.cFileName;
    if (hSearch==INVALID_HANDLE_VALUE) {
     cout<<"Directory or file name is invalid!"<<endl;
     return false;
    }    
    if(DeleteFile(tmpPath.c_str()))
    {
     cout<<"File "<<tmpPath.c_str()<<" is deleted!"<<endl;
    }
    else
    {
     cout<<"File "<<tmpPath.c_str()<<" is not deleted!"<<endl;
     return false;
    }
   }   
  }  
  else   
  {   
   if( GetLastError() == ERROR_NO_MORE_FILES )          //Normal Finished    
   {    
    bSearchFinished = TRUE;    
   }
   else    
    bSearchFinished = TRUE;     //Terminate Search   
  }  
    } 
    FindClose(hSearch);
 return true;
}

////////////////////////////////////////////////////////////////////////////////////////
//说明:
//[1] windows下 参数为 "" 或 / 获得的目录是当前的盘符
//[2] 绝对路径中的/可以多个重复,windows识别为一个/ ;
//    如: CopyFile("F://///here/////file.txt","I:////");等同于CopyFile("F://here//file.txt","I://");
//[3] 该函数拷贝指定目录下的所有文件到指定目标目录, 不递归拷贝子文件夹的内容
//[4] fileType : *.* , *.txt , *.doc 等等形式
////////////////////////////////////////////////////////////////////////////////////////
bool CopyFileInDir(string rootDir,string destDir,string fileType)
{
 if (strcmp(rootDir.c_str(),"")==0
  ||strcmp(rootDir.c_str(),"//")==0) {
  cout<<"非法源路径!"<<endl;
  return false;
 }

 if (strcmp(destDir.c_str(),"")==0
  ||strcmp(destDir.c_str(),"//")==0) {
  cout<<"非法目标路径!"<<endl;
  return false;
 }
 
 if (!IsFileDirExist(destDir)) {
  CreateDirectory(destDir.c_str(),NULL);
 }
    
    WIN32_FIND_DATA fd; 
    ZeroMemory(&fd, sizeof(WIN32_FIND_DATA)); 
 
    HANDLE hSearch; 
    string filePathName; 
    string tmpPath; 
 string tmpDestPath;
     
    filePathName=rootDir; 
 
    BOOL bSearchFinished = FALSE; 
 
    if( filePathName.data()[filePathName.length()-1] != '//' )  
    {  
  filePathName+="//";
    }
 
    filePathName+= fileType; 
    hSearch = FindFirstFile(filePathName.c_str(), &fd);

 if (hSearch==INVALID_HANDLE_VALUE) {
  cout<<"无效文件名"<<endl;
  return false;
 }
 
    while( !bSearchFinished )  
    {  
  if( FindNextFile(hSearch, &fd) )   
  {   
   if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    
    && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )     
   {    
    tmpPath = rootDir;
    if( tmpPath.data()[tmpPath.length() -1] != '//' )  
    {  
     tmpPath+="//";  
    }
    tmpPath+= fd.cFileName;
    cout<<tmpPath.c_str()<<" is a directory!"<<endl;    
   }    
   else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )    
   {    
    tmpPath = rootDir;
    if( tmpPath.data()[tmpPath.length() -1] != '//' )  
    {  
     tmpPath+="//";  
    }
    tmpPath+= fd.cFileName;    
    tmpDestPath = destDir; 
    if( tmpDestPath.data()[tmpDestPath.length() -1] != '//' )  
    {  
     tmpDestPath+= "//";  
    }   
    tmpDestPath+=fd.cFileName;    
    if(CopyFile(tmpPath.c_str(),tmpDestPath.c_str(),FALSE))
     cout<<"Copy file From "<<tmpPath.c_str()<<" To "
     <<tmpDestPath.c_str()<<" successfully!"<<endl;
    else
     return false;
   }   
  }  
  else   
  {   
   if( GetLastError() == ERROR_NO_MORE_FILES )          //Normal Finished    
   {    
    bSearchFinished = TRUE;    
   }
   else    
    bSearchFinished = TRUE;     //Terminate Search   
  }  
    } 
    FindClose(hSearch); 
 return true;
}

////////////////////////////////////////////////////////////////////////////////////////
//说明:
//[1] windows下 参数为 "" 或 / 获得的目录是当前的盘符
//[2] 绝对路径中的/可以多个重复,windows识别为一个/ ;
//    如: CopyFile("F://///here/////file.txt","I:////");等同于CopyFile("F://here//file.txt","I://");
//[3] 该函数拷贝指定目录下的所有文件,并递归拷贝子文件夹的内容到指定目标目录
//[4] fileType : *.* , *.txt , *.doc 等等形式
////////////////////////////////////////////////////////////////////////////////////////
bool CopyFileDir(string rootDir,string destDir,string fileType)
{
 if (strcmp(rootDir.c_str(),"")==0
  ||strcmp(rootDir.c_str(),"//")==0) {
  cout<<"非法源路径!"<<endl;
  return false;
 }

 if (strcmp(destDir.c_str(),"")==0
  ||strcmp(destDir.c_str(),"//")==0) {
  cout<<"非法目标路径!"<<endl;
  return false;
 }
 if (!IsFileDirExist(destDir)) {
  if(CreateDirectory(destDir.c_str(),NULL))
  {
   cout<<"Create Directory "<<destDir.c_str()<<endl;
  }
 } 
    
    WIN32_FIND_DATA fd; 
    ZeroMemory(&fd, sizeof(WIN32_FIND_DATA)); 
 
    HANDLE hSearch; 
    string filePathName; 
    string tmpPath; 
 string tmpDestPath;
     
    filePathName=rootDir; 
 
    BOOL bSearchFinished = FALSE; 
 
    if( filePathName.data()[filePathName.length()-1] != '//' )  
    {  
  filePathName+="//";
    }
 
    filePathName+= fileType; 
    hSearch = FindFirstFile(filePathName.c_str(), &fd);

 if (hSearch==INVALID_HANDLE_VALUE) {
  cout<<"无效文件名"<<endl;
  return false;
 }
 
    while( !bSearchFinished )  
    {  
  if( FindNextFile(hSearch, &fd) )   
  {   
   if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    
    && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )     
   {    
    tmpPath = rootDir;
    if( tmpPath.data()[tmpPath.length() -1] != '//' )  
    {  
     tmpPath+="//";  
    }
    tmpPath+= fd.cFileName;    
    tmpDestPath = destDir; 
    if( tmpDestPath.data()[tmpDestPath.length() -1] != '//' )  
    {  
     tmpDestPath+= "//";  
    }   
    tmpDestPath+=fd.cFileName;        
    if(!CopyFileDir(tmpPath,tmpDestPath,fileType))
    {
     return false;
    }
   }    
   else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )    
   {    
    tmpPath = rootDir;
    if( tmpPath.data()[tmpPath.length() -1] != '//' )  
    {  
     tmpPath+="//";  
    }
    tmpPath+= fd.cFileName;    
    tmpDestPath = destDir; 
    if( tmpDestPath.data()[tmpDestPath.length() -1] != '//' )  
    {  
     tmpDestPath+= "//";  
    }   
    tmpDestPath+=fd.cFileName;    
    if(CopyFile(tmpPath.c_str(),tmpDestPath.c_str(),FALSE))
     cout<<"Copy file From "<<tmpPath.c_str()<<" To "
     <<tmpDestPath.c_str()<<" successfully!"<<endl;
    else
     return false;
   }   
  }  
  else   
  {   
   if( GetLastError() == ERROR_NO_MORE_FILES )          //Normal Finished    
   {    
    bSearchFinished = TRUE;    
   }
   else    
    bSearchFinished = TRUE;     //Terminate Search   
  }  
    } 
    FindClose(hSearch); 
 return true;
}

阅读更多
个人分类: C/C++
上一篇Pro*C/C++ windows编程
下一篇任意进制数之间的转换
想对作者说点什么? 我来说一句

文件树状目录 树状目录

2008年12月02日 14KB 下载

C++Builder文件,目录和驱动器

2011年08月04日 1.69MB 下载

目录文件

2012年12月18日 3.44MB 下载

java打包目录文件为ZIP

2009年04月14日 2KB 下载

没有更多推荐了,返回首页

关闭
关闭
关闭