【轉】VC++ MFC文件的移動複製刪除更名遍歷操作

1.判斷文件是否存在

利用CFile類和CFileStatus類判斷

CFileStatus filestatus;
if (CFile::GetStatus(_T("d://softist.txt"), filestatus))
   AfxMessageBox(_T("文件存在"));
else
   AfxMessageBox(_T("文件不存在"));

利用CFileFind類判斷

CFileFind filefind;

CString strPathname = _T("d://softist.txt");

if(filefind.FindFile(strPathname))

   AfxMessageBox(_T("文件存在"));

else

   AfxMessageBox(_T("文件不存在"));






利用API函數FindFirstFile判斷,這個函數還可以判斷文件屬性,日期,大小等屬性。例:

WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(_T("d://softist.txt"), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
   AfxMessageBox(_T("文件不存在"));
}
else
{
   AfxMessageBox(_T("文件存在"));
   FindClose(hFind);
}

2.文件日期操作。下面是取得"d://softist.txt"的文件修改時間,TRACE以後,再把文件修改時間改成 2000-12-03 12:34:56。

HANDLE     hFile;

FILETIME   filetime;

FILETIME   localtime;

SYSTEMTIME systemtime;


hFile = CreateFile(_T("d://softist.txt"), GENERIC_READ | GENERIC_WRITE,

    0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


if (hFile != INVALID_HANDLE_VALUE)

{

   GetFileTime(hFile, NULL, NULL, &filetime);      //取得UTC文件時間

   FileTimeToLocalFileTime(&filetime, &localtime); //換成本地時間

   FileTimeToSystemTime(&localtime, &systemtime);  //換成系統時間格式


   TRACE("%04d-%02d-%02d %02d:%02d:%02d/r/n",

         systemtime.wYear, systemtime.wMonth, systemtime.wDay,

         systemtime.wHour, systemtime.wMinute, systemtime.wSecond);


   //把文件時間修改成 2000-12-03 12:34:56

   systemtime.wYear = 2000; systemtime.wMonth = 12; systemtime.wDay = 3;

   systemtime.wHour = 12; systemtime.wMinute = 34; systemtime.wSecond = 56;

   SystemTimeToFileTime(&systemtime, &localtime); //換成文件時間格式

   LocalFileTimeToFileTime(&localtime, &filetime); //換成UTC時間

   SetFileTime(hFile, NULL, NULL, &filetime);  //設定UTC文件時間

   CloseHandle(hFile);

}

3.設置文件屬性

BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes );

dwFileAttributes 的意義

FILE_ATTRIBUTE_ARCHIVE   保存文件

FILE_ATTRIBUTE_HIDDEN    隱藏文件

FILE_ATTRIBUTE_NORMAL   通常文件

FILE_ATTRIBUTE_READONLY 只讀文件

FILE_ATTRIBUTE_SYSTEM   系統文件

例:

SetFileAttributes(_T("d://softist.txt", FILE_ATTRIBUTE_READONLY);

文件的複製,移動,刪除,更名

1.文件的複製API

BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);

bFailIfExists用來制定如果目標文件已經存在時,是否中止複製操作,返回FALSE。例,把"d://softist1.txt"複製到"d://softist2.txt",即使"d://softist2.txt"已經存在。

BOOL bRet = CopyFile(_T("d://softist1.txt"), _T("d://softist2.txt"), FALSE);






2.文件的移動API

BOOL MoveFile( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName );

這個函數可以移一個文件,或目錄(包括子目錄),例,

MoveFile(_T("d://softist.txt"), _T("d://softist2.txt"));

下面的API帶着選項dwFlags ,移動文件,或目錄(包括子目錄)。

BOOL MoveFileEx( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, DWORD dwFlags );

dwFlags的意義:

MOVEFILE_REPLACE_EXISTING 如果目標文件存在是否替代它 。

MOVEFILE_DELAY_UNTIL_REBOOT 文件移動準備,下次啓動系統時執行移動作業。

3.刪除文件

API:

BOOL DeleteFile( LPCTSTR lpFileName );

MFC:

static void PASCAL CFile::Remove(LPCTSTR lpszFileName);

4.文件更名MFC:

TCHAR* pOldName = _T("Oldname_File.dat");

TCHAR* pNewName = _T("Renamed_File.dat");

try

{

   CFile::Rename(pOldName, pNewName);

}

catch(CFileException* pEx )

{

   TRACE(_T("File %20s not found, cause = %d/n"), pOldName,

   pEx->m_cause);

   pEx->Delete();

}

遍歷文件目錄

遍歷文件目錄,即把一個目錄裏的文件以及子目錄裏的文件名都取出來。本文是CFileFind類的使用例的筆記。下面的程序是從一個目錄出發,把這個目錄裏的所有成員按着層次TRACE到DEBUG輸出畫面。

void TravelFolder(CString strDir, int nDepth)

{

   CFileFind filefind;                                         //聲明CFileFind類型變量

   CString strWildpath = strDir + _T("//*.*");     //所有文件都列出。

   if(filefind.FindFile(strWildpath, 0))                    //開始檢索文件

   {

       BOOL bRet = TRUE;

       while(bRet)

       {

           bRet = filefind.FindNextFile();                 //枚舉一個文件

           if(filefind.IsDots())                                 //如果是. 或 .. 做下一個

               continue;

           for (int i = 0; i < nDepth; i ++)                 //層次空格打印

           {

               TRACE(_T("    "));

           }

           if(!filefind.IsDirectory())                          //不是子目錄,把文件名打印出來

           {

               CString strTextOut = strDir + CString(_T("//")) + filefind.GetFileName();

               TRACE(_T("file = %s/r/n"), strTextOut);

           }

           else                                                    //如果是子目錄,遞歸調用該函數

           {

               CString strTextOut = strDir + CString(_T("//")) + filefind.GetFileName();

               TRACE(_T("dir = %s/r/n"), strTextOut);

               TravelFolder(strTextOut, nDepth + 1);//遞歸調用該函數打印子目錄裏的文件

           }

       }

       filefind.Close();

   }

}

//測試,把d盤的/temp裏的所有文件和子目錄打印到DEBUG輸出畫面。

void Test()

{

   TravelFolder(CString(_T("d://temp")), 0);

}

文件目錄操作

1.創建目錄(API)

BOOL CreateDirectory(LPCTSTR pstrDirName);//pstrDirName是全路徑

2.刪除目錄(API)

BOOL RemoveDirectory( LPCTSTR lpPathName );

3.判斷目錄是否存在(Shell Function)

#include <shlwapi.h>#pragma comment(lib, "shlwapi.lib") if (PathIsDirectory(_T("d://temp"))) AfxMessageBox(_T("存在"));else AfxMessageBox(_T("不存在"));






4.取得當前目錄(API)

DWORD GetCurrentDirectory( DWORD nBufferLength, LPTSTR lpBuffer );

5.取得執行文件所在目錄(API)

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

6.取得功能目錄(Shell Function)

BOOL SHGetSpecialFolderPath( HWND hwndOwner,  LPTSTR lpszPath, int nFolder, BOOL fCreate);

例:讀取我的檔案目錄

   TCHAR szDirFile[1024];
   memset(szDirFile, 0, sizeof(szDirFile));
   BOOL bRet = SHGetSpecialFolderPath(NULL,szDirFile,CSIDL_PERSONAL,true);
   if (bRet)
   {
       AfxMessageBox(szDirFile);
   }

7.選擇目錄用的對話框界面

利用Shell Function可以打出選擇目錄用的對話框界面


#include<shlobj.h>

INT CALLBACK _BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM pData)

{

   TCHAR szDir[MAX_PATH];

   switch(uMsg)

   {

   case BFFM_INITIALIZED:

       // WParam is TRUE since you are passing a path.

       // It would be FALSE if you were passing a pidl.

       SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)pData);

       break;

   case BFFM_SELCHANGED:

       // Set the status window to the currently selected path.

       if (SHGetPathFromIDList((LPITEMIDLIST)lParam ,szDir))

       {

           SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);

       }

       break;

   }

   return 0;

}


CString GetFolderFullpath(LPCTSTR lpszDefault)

{

   TCHAR buffDisplayName[MAX_PATH];

   TCHAR fullpath[MAX_PATH];

   BROWSEINFO  browseinfo;

   LPITEMIDLIST lpitemidlist;


   ZeroMemory(&browseinfo, sizeof( BROWSEINFO ));

   browseinfo.pszDisplayName = buffDisplayName ;

   browseinfo.lpszTitle = _T("請選擇目錄");

   browseinfo.ulFlags = BIF_RETURNONLYFSDIRS;

   browseinfo.lParam = (LPARAM)lpszDefault;

   browseinfo.lpfn = _BrowseCallbackProc;


   if(!(lpitemidlist = SHBrowseForFolder(&browseinfo)))

   {

       AfxMessageBox(_T("沒有選擇目錄"));

       return CString(_T(""));

   }

   else

   {

       SHGetPathFromIDList(lpitemidlist, fullpath);      

       CoTaskMemFree(lpitemidlist);

       return CString(fullpath);

   }

}


void CTest77Dlg::OnBnClickedButton1()

{

   CString strFolderFullpath = GetFolderFullpath(_T("d://Temp"));

   if (strFolderFullpath != _T(""))

       AfxMessageBox(strFolderFullpath);

}


轉載:http://blog.csdn.net/chaoguodong/article/details/7349022

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章