Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17406
  • 博文数量: 6
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 77
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-24 16:00
文章分类
文章存档

2013年(6)

我的朋友

分类: C/C++

2013-04-01 15:15:57

VC++ 对文件或目录的搜索、保存、修改与删除等操作

#include

以下函数可用于保存功能:

1、在连接的计算机上创建一个文件目录

BOOL CreateDirectory(
   LPCTSTR pstrDirName

);

这是WinAPI函数,就不给出源代码了。

//将一个目录的内容pszSrcDir复制到另一个目录pszDesDir下

2、CopyDirToDir()

BOOL CopyDirToDir(wchar_t   *pszSrcDir,wchar_t   *pszDesDir)
{

 SHFILEOPSTRUCT      FileOp = {0}; 

 FileOp.fFlags              =   FOF_NOCONFIRMATION;  
 FileOp.lpszProgressTitle   =   NULL;  
 FileOp.hNameMappings       =   NULL;  
 FileOp.hwnd                =  NULL;  
 FileOp.pTo                 =   pszDesDir;  
 FileOp.wFunc               =   FO_COPY;  
 FileOp.pFrom               =   pszSrcDir;

 return   SHFileOperation(&FileOp)   ==   0;  
}

其中 SHFileOperation(&FileOp) 可用于

Copies, moves, renames, or deletes a file system object.

3、复制一个文件lpExistingFileName到一个新的路径下lpNewFileName

BOOL CopyFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  BOOL bFailIfExists

);

如果bFailIfExists为TRUE,那么当lpNewFileName路径复制前已经存在时,

那么函数CopyFile不执行,否则函数照样执行并且覆盖以前的文件。

4、获得运行程序的满路径(Full Path)的API函数: GetModuleFileName()

DWORD GetModuleFileName(
  HMODULE hModule,
  LPTSTR  lpFilename,
  DWORD nSize);

hModule 
[in] Handle to the module whose path is being requested. 
If hModule  is NULL, 
      GetModuleFileName retrieves the path for the current module.

lpFilename 
[out]输出不存在终止符'\0'的程序路径(Full Path) 
nSize

[in] Size of the lpFilename buffer, in TCHARs. 可指定为 MAX_PATH 即:260 
_wsplitpath 或 _splitpath 解析满路径的API函数。

如:_wsplitpath( FullPath, drive, dir, filename, ext );

其中:

FullPath为输入的满路径,

drive为驱动器,

dir为没有驱动器与文件名的目录,

filename为文件名,

ext为文件扩展名。


以下函数可用于修改文件名称的功能: 
将文件从一个目录lpExistingFileName移动到另一个目录lpNewFileName 
BOOL MoveFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName
); 
移动时包含子文件夹的内容也一同移过去,具体如何移动, 
也可用另一个扩展函数 
BOOL MoveFileEx(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  DWORD dwFlags 
); 
其中dwFlags可以指定不同的移动方式。 
 

以下函数可用于删除文件

API函数DeleteFile()

BOOL DeleteFile(
  LPCTSTR lpFileName

);

//自定义的函数,删除某个文件FullPathName

//功能更加强大,可以将只读的文件一并删除

//FullPathName = 文件绝对路径 + 文件名

bool MyDeleteFile(wchar_t* FullPathName)
{
 ASSERT(FullPathName != NULL);
 DWORD dwAttrs;
 //获取文件属性
 dwAttrs=GetFileAttributesW(FullPathName);
 //如果为只读属性,则去除
 if (dwAttrs & FILE_ATTRIBUTE_READONLY)
 {
  SetFileAttributes(FullPathName,
   dwAttrs & ~FILE_ATTRIBUTE_READONLY);
 }
 if(!SUCCEEDED(DeleteFile(FullPathName)))
 {

   //删除失败
   return false;
 }

 //删除成功
 return true;
}


//自定义的函数,删除目录与目录下所有的子文件夹、文件。

//功能更加强大,可以将只读的文件一并删除

BOOL  MyDeleteDir(wchar_t  *DirName)  
{  
 WIN32_FIND_DATA  FileData;
 HANDLE hSearch;
 DWORD dwAttrs;
 wchar_t   tempFileFind[MAX_PATH];  
 wsprintf(tempFileFind,L"%s\\*.*",DirName); 

 //搜索第一个符合文件目录或文件名tempFileFind的文件

 //可用FindNextFile继续搜索下一个在相同目录下的文件

 //可用FindClose(hSearch);结束搜索。具体用法看下文。

 //The FindFirstFile function searches a directory for a file

 //whose name matches the specified file name.

 //FindFirstFile 同样搜索子目录下的文件.   
 hSearch = FindFirstFileW(tempFileFind, &FileData);
 int a=GetLastError();
 BOOL bFinished=FALSE;
 if (hSearch==INVALID_HANDLE_VALUE)
 {
  bFinished=TRUE;
 }
 while(!bFinished)  
 {
  wchar_t   foundFileName[MAX_PATH];
  if(FileData.cFileName[0]!='.')
  {
   wcscpy(foundFileName,FileData.cFileName);  
   if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )  
   {  
    wchar_t   tempDir[MAX_PATH];  
    wsprintf(tempDir,L"%s\\%s",DirName,foundFileName);  
    MyDeleteDir(tempDir);  
   }  
   else  
   {  
    wchar_t   tempFileName[MAX_PATH];  
    wsprintf(tempFileName,L"%s\\%s",DirName,foundFileName);

    //获取文件的属性,如只读属性 FILE_ATTRIBUTE_READONLY
    dwAttrs = GetFileAttributesW(tempFileName);

    //设置文件属性为非只读~FILE_ATTRIBUTE_READONLY);

    SetFileAttributes(tempFileName,
     dwAttrs & ~FILE_ATTRIBUTE_READONLY);

    if(!DeleteFileW(tempFileName))
    {
     dwAttrs=GetFileAttributesW(tempFileName);
     if (dwAttrs & FILE_ATTRIBUTE_READONLY)
     {
      SetFileAttributes(tempFileName,
       dwAttrs & ~FILE_ATTRIBUTE_READONLY);
     }
     if(!DeleteFileW(tempFileName))
     {
      
     }
    }
   }
  }  
  if (!FindNextFileW(hSearch,&FileData))
  {
   bFinished=TRUE;
  }
 }  
 FindClose(hSearch);

 //删除目录DirName,用以下三种的其中一种,只是编译环境不同而已,功能一样

 //RemoveDirectory或者RemoveDirectoryW或者RemoveDirectoryA
 if(!RemoveDirectoryW(DirName))  
 {  
  return   FALSE;  
 }  
 return   TRUE;  
}

//如果当前文件名FileName在目录下FullPath已经存在。 
//自定义的函数:实现重命名文件名 
wchar_t* RenameExitFile(wchar_t* FullPath,wchar_t* FileName)
{
 ASSERT(FileName != NULL && FullPath != NULL);
 //返回的文件名称
 wchar_t wcsMediaName[MAX_PATH] = {0};
 wcscpy(wcsMediaName,FileName); 
 //全路径:文件路径加文件名
 wchar_t szDestFile[MAX_PATH] = {0};
 wsprintf(szDestFile, L"%s\\%s", FullPath, FileName); 
 //判断文件资源是否已经存在 
 if(_waccess(szDestFile,0) == 0)
 {
  //临时文件路径
 <

阅读(1951) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~