1. 程式人生 > >Windows 資料夾操作:複製和刪除整個資料夾

Windows 資料夾操作:複製和刪除整個資料夾

檔案和資料夾的建立、複製、刪除、重新命名等操作是經常要用到的,作者根據自己的經驗,並查詢了MSDN,特意總結了常用檔案和資料夾的相關操作,重點討論了複製整個資料夾和刪除整個資料夾

1、檔案操作基本函式

WinBase.h中聲明瞭Windows平臺下的基本的API函式,包括檔案和目錄的基本操作。

下面列出部分常用的檔案操作相關函式。

函式

說明

DeleteFile

刪除單個檔案,不能刪除目錄和只讀檔案

CopyFile

複製單個檔案

MoveFile

移動移動檔案或目錄

CreateDirectory

建立目錄

RemoveDirectory

刪除空目錄

更多的函式可查詢Winbase.h檔案或者MSDN中的File Management FunctionsDirectory Management Functions 。

2、複製目錄和刪除目錄

WinBase.h中的檔案操作函式中並沒有直接實現整個資料夾的複製和刪除操作的函式,需要自己實現。

(1)判斷指定路徑是否有效目錄

/*判斷一個路徑是否是已存在的目錄*/
BOOL IsDirectory(LPCTSTR pstrPath)
{
    if (NULL == pstrPath)
    {
        return FALSE;
    }

    /*去除路徑末尾的反斜槓*/
    CString strPath = pstrPath;
    if (strPath.Right(1) == _T('\\'))
    {
        strPath.Delete(strPath.GetLength()-1);
    }

    CFileFind finder;
    BOOL bRet = finder.FindFile(strPath);
    if (!bRet)
    {
        return FALSE;
    }

    /*判斷該路徑是否是目錄*/
    finder.FindNextFile();
    bRet = finder.IsDirectory();
    finder.Close();
    return bRet;
}

(2)複製目錄

複製目錄函式的大致思路為:查詢目錄中所有檔案,如果是檔案直接複製,如果是目錄,則遞迴呼叫目錄複製函式。

/*複製目錄中的所有內容*/
BOOL CopyFolder(LPCTSTR pstrSrcFolder, LPCTSTR pstrDstFolder)
{
    if ((NULL == pstrSrcFolder) || (NULL == pstrSrcFolder))
    {
        return FALSE;
    }

    /*檢查源目錄是否是合法目錄*/
    if (!IsDirectory(pstrSrcFolder))
    {
        return FALSE;
    }

    /*把檔名稱轉換為CString型別,並確認目錄的路徑末尾為反斜槓*/
    CString strSrcFolder(pstrSrcFolder);
    if (strSrcFolder.Right(1) != _T('\\'))
    {
        strSrcFolder += _T("\\");
    }
    CString strDstFolder(pstrDstFolder);
    if (strDstFolder.Right(1) != _T("\\"))
    {
        strDstFolder += _T("\\");
    }

    /*如果是目錄自身複製,直接返回複製成功*/
    if (0 == _tcscmp(strSrcFolder, strDstFolder))
    {
        return TRUE;
    }

    /*如果目的目錄不存在,則建立目錄*/
    if (!IsDirectory(strDstFolder))
    {
        if (!CreateDirectory(strDstFolder, NULL))
        {
            /*建立目的目錄失敗*/
            return FALSE;
        }
    }

    /*建立源目錄中查詢檔案的萬用字元*/
    CString strWildcard(strSrcFolder);
    strWildcard += _T("*.*");

    /*開啟檔案查詢,檢視源目錄中是否存在匹配的檔案*/
    /*呼叫FindFile後,必須呼叫FindNextFile才能獲得查詢檔案的資訊*/
    CFileFind finder;
    BOOL bWorking = finder.FindFile(strWildcard);

    while (bWorking)
    {
        /*查詢下一個檔案*/
        bWorking = finder.FindNextFile();

        /*跳過當前目錄“.”和上一級目錄“..”*/
        if (finder.IsDots())
        {
            continue;
        }

        /*得到當前要複製的原始檔的路徑*/
        CString strSrcFile = finder.GetFilePath();

        /*得到要複製的目標檔案的路徑*/
        CString strDstFile(strDstFolder);
        strDstFile += finder.GetFileName();

        /*判斷當前檔案是否是目錄,*/
        /*如果是目錄,遞迴呼叫複製目錄,*/
        /*否則,直接複製檔案*/
        if (finder.IsDirectory())
        {
            if (!CopyFolder(strSrcFile, strDstFile))
            {
                finder.Close();
                return FALSE;
            }
        }
        else
        {
            if (!CopyFile(strSrcFile, strDstFile, FALSE))
            {
                finder.Close();
                return FALSE;
            }
        }

    } /*while (bWorking)*/

    /*關閉檔案查詢*/
    finder.Close();

    return TRUE;

}

(3)刪除目錄

刪除目錄的思路和複製目錄的思路類似,也是採用遞迴的方法。

/*刪除目錄及目錄中的所有內容*/
BOOL DeleteFolder(LPCTSTR pstrFolder)
{
    if ((NULL == pstrFolder))
    {
        return FALSE;
    }

    /*檢查輸入目錄是否是合法目錄*/
    if (!IsDirectory(pstrFolder))
    {
        return FALSE;
    }

    /*建立源目錄中查詢檔案的萬用字元*/
    CString strWildcard(pstrFolder);
    if (strWildcard.Right(1) != _T('\\'))
    {
        strWildcard += _T("\\");
    }
    strWildcard += _T("*.*");

    /*開啟檔案查詢,檢視源目錄中是否存在匹配的檔案*/
    /*呼叫FindFile後,必須呼叫FindNextFile才能獲得查詢檔案的資訊*/
    CFileFind finder;
    BOOL bWorking = finder.FindFile(strWildcard);

    while (bWorking)
    {
        /*查詢下一個檔案*/
        bWorking = finder.FindNextFile();

        /*跳過當前目錄“.”和上一級目錄“..”*/
        if (finder.IsDots())
        {
            continue;
        }

        /*得到當前目錄的子檔案的路徑*/
        CString strSubFile = finder.GetFilePath();

        /*判斷當前檔案是否是目錄,*/
        /*如果是目錄,遞迴呼叫刪除目錄,*/
        /*否則,直接刪除檔案*/
        if (finder.IsDirectory())
        {
            if (!DeleteFolder(strSubFile))
            {
                finder.Close();
                return FALSE;
            }
        }
        else
        {
            if (!DeleteFile(strSubFile))
            {
                finder.Close();
                return FALSE;
            }
        }

    } /*while (bWorking)*/

    /*關閉檔案查詢*/
    finder.Close();

    /*刪除空目錄*/
    return RemoveDirectory(pstrFolder);
}

3shlwapi.h中的檔案操作函式

shlwapi.hshlwapi.dll標頭檔案,shlwapi.dllMicrosoft Shell Light-weight Utility Library)中定義了路徑相關的操作,也包括了部分檔案操作函式。由於shlwapi.dll屬於Microsoft Windows Shell,因此這些檔案操作特點與通過Shell進行檔案操作類似。

下面列出部分常用的檔案操作相關函式。

PathIsDirectory

判斷一個路徑是否有效目錄

PathIsDirectoryEmpty

判斷一個路徑是否空目錄

PathFileExists

判斷一個路徑是否有效目錄或檔案

PathRenameExtension

更改檔案的字尾名

SHFileOperation

可實現檔案或目錄的複製、移動、重新命名和刪除操作,並可一次操作多個檔案或目錄

其中,SHFileOperation可實現整個目錄的內容的複製和刪除。SHFileOperation可一次實現多個目錄的複製或刪除,其輸入引數結構體SHFILEOPSTRUCT中的pFrom(源目錄)和pTo(目的目錄)都可以輸入多個目錄,目錄之間通過'\0'分割,pFrompTo必須以2'\0'結尾。一般情況下,我們都只是對一個目錄操作,因此,SHFileOperation呼叫並不是很方便,下面就對SHFileOperation進行包裝,提供更方便呼叫的目錄操作函式。

具體的程式碼實現如下:

1)複製目錄

 tczSrcFolder[iSrcPathLen] = _T('\0');
    tczSrcFolder[iSrcPathLen+1] = _T('\0');

    /*確保目的目錄的路徑以2個\0結尾*/
    TCHAR tczDstFolder[MAX_PATH+1];
    ZeroMemory(tczDstFolder, (MAX_PATH+1)*sizeof(TCHAR));
    _tcscpy(tczDstFolder, pstrDstFolder);
    tczDstFolder[iDstPathLen] = _T('\0');
    tczDstFolder[iDstPathLen+1] = _T('\0');

    SHFILEOPSTRUCT FileOp; 
    ZeroMemory(&FileOp, sizeof(SHFILEOPSTRUCT)); 
    FileOp.fFlags |= FOF_SILENT;        /*不顯示進度*/
    FileOp.fFlags |= FOF_NOERRORUI ;    /*不報告錯誤資訊*/
    FileOp.fFlags |= FOF_NOCONFIRMATION;/*不進行確認*/
    FileOp.hNameMappings = NULL;
    FileOp.hwnd = NULL;
    FileOp.lpszProgressTitle = NULL;
    FileOp.wFunc = FO_COPY;
    FileOp.pFrom = tczSrcFolder;        /*源目錄,必須以2個\0結尾*/
    FileOp.pTo = tczDstFolder;            /*目的目錄,必須以2個\0結尾*/    

    /*複製目錄*/
    if (0 == SHFileOperation(&FileOp))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }

}

2)刪除目錄

/*通過呼叫ShFileOperation來實現整個目錄的刪除*/
/*只刪除單個目錄*/
BOOL CFolder::SHDeleteFolder(LPCTSTR pstrFolder, BOOL bAllowUndo)
{
    if ((NULL == pstrFolder))
    {
        return FALSE;
    }

    int iPathLen = _tcslen(pstrFolder);
    if (iPathLen >= MAX_PATH)
    {
        return FALSE;
    }

    /*確保目錄的路徑以2個\0結尾*/
    TCHAR tczFolder[MAX_PATH+1];
    ZeroMemory(tczFolder, (MAX_PATH+1)*sizeof(TCHAR));
    _tcscpy(tczFolder, pstrFolder);
    tczFolder[iPathLen] = _T('\0');
    tczFolder[iPathLen+1] = _T('\0');

    SHFILEOPSTRUCT FileOp; 
    ZeroMemory(&FileOp, sizeof(SHFILEOPSTRUCT)); 
    FileOp.fFlags |= FOF_SILENT;        /*不顯示進度*/
    FileOp.fFlags |= FOF_NOERRORUI;        /*不報告錯誤資訊*/
    FileOp.fFlags |= FOF_NOCONFIRMATION;/*直接刪除,不進行確認*/
    FileOp.hNameMappings = NULL;
    FileOp.hwnd = NULL;
    FileOp.lpszProgressTitle = NULL;
    FileOp.wFunc = FO_DELETE;
    FileOp.pFrom = tczFolder;            /*要刪除的目錄,必須以2個\0結尾*/
    FileOp.pTo = NULL; 

    /*根據傳遞的bAllowUndo引數確定是否刪除到回收站*/
    if (bAllowUndo)
    {   
        FileOp.fFlags |= FOF_ALLOWUNDO; /*刪除到回收站*/
    }  
    else  
    {   
        FileOp.fFlags &= ~FOF_ALLOWUNDO; /*直接刪除,不放入回收站*/
    }
    
    /*刪除目錄*/
    if (0 == SHFileOperation(&FileOp))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

4、示例工程

作者通過VC6.0和VS2010分別針對以上程式碼建立了示例工程,在工程中,把以上函式封裝到CFolder類中,並把所有函式設定為靜態函式。在示例工程中,分別對這些函式進行了呼叫測試。

工程檔案下載:

5、參考資料

(1)、File Management Functions

(2)、Directory Management Functions






相關推薦

Windows 資料操作複製刪除整個資料

檔案和資料夾的建立、複製、刪除、重新命名等操作是經常要用到的,作者根據自己的經驗,並查詢了MSDN,特意總結了常用檔案和資料夾的相關操作,重點討論了複製整個資料夾和刪除整個資料夾 1、檔案操作基本函式 WinBase.h中聲明瞭Windows平臺下的基本的API函式,包

資料複製刪除整個資料

轉載請註明原文連結。 檔案和資料夾的建立、複製、刪除、重新命名等操作是經常要用到的,作者根據自己的經驗,並查詢了MSDN,特意總結了常用檔案和資料夾的相關操作,重點討論了複製整個資料夾和刪除整個資料夾 1、檔案操作基本函式 WinBase.h中聲明瞭Windows平

Windows下一個複製刪除檔案(資料)的bat指令碼

:: 指令碼建立時最好選擇GB2312編碼 :: @echo off 表示不回顯執行的命令 @echo off ::設定源路徑和目的路徑,使用該變數時需要用一對%包起來 set SRC_PATH=..

C# winform資料操作複製刪除

首先需要新增名稱空間: using System.IO; 下面分別有2個刪除方法: /// <summary> /// 刪除資料夾下所有檔案 /// </summary> /// &

Linux小小白入門教程(六)建立刪除資料

以下操作在Linux終端進行。Linux因為許可權非常嚴格,所以暫時所有的命令操作全部是在/home資料夾下的/yangjw資料夾下進行。/yangjw資料夾就是登入使用者名稱所在的資料夾,出了此資料

SQL語句基礎1建立刪除資料庫,建表,插入資料並加入適當約束

1.建立圖書管理資料庫 create database bookManager on (     name=bookManager_data,     filename='D:\SQL\bookManager_data.mdf',     size=5MB,     maxs

C++資料結構--二叉樹的複製刪除

本示例所用到的二叉樹: template<typename T>class node {    public:       T val; //節點值 node<T>* left; //左節點  node<T>* right; //右節點 node():val(T()),l

資料分析你需要知道的操作ETLELT

如果您接觸過資料倉庫, 您可能會使用 ETL (Extract、 Transform、 Load) 或 ELT ( Extract、Load、 Transform) 將您的資料從不同的來源提取到資料倉庫中。這些是移動資料或整合資料的常用方法, 以便您可以關聯來自不同來源的資訊, 將資料安全地儲存在一個位置,

轉發centos徹底刪除文件、文件命令(centos 新建、刪除、移動、復制等命令)

目錄 str detail 文件夾 目的 刪除文件夾 -i 命名 新建文件夾 http://blog.csdn.net/lpdx111/article/details/16877725 centos徹底刪除文件夾、文件命令(centos 新建、刪除、移動、復制等命令:

Windows 7關閉睡眠(休眠)模式刪除休眠文件

啟用 width ber load b-s 註意 睡眠 src 管理員 原文地址:https://www.192ly.com/pc/win7/gb-sm.html 怎麽關閉Windows 7關閉睡眠(休眠)功能?Windows 7系統中怎麽刪除休眠文件?Windows 7

SQL Sever實驗一 建立刪除資料庫資料

一. 實驗目的     1. 熟悉SQL    Server    2008    中SQL    Server   &n

Android開發(2)資料儲存之一SharedPrefrences檔案讀寫

一、資料儲存 本文主要講前兩種儲存方式,其中檔案讀寫只記錄Internal Storage方式 1. SharedPrefrences方式 輕量級NVP方式儲存,以XML的檔案方式儲存,適合少量資料的儲存。 NVP:Name/Value pair, 名稱/值 對。 2.

SAP標準培訓課程C4C10學習筆記(四)第四單元產品價格主資料

這個單元的內容是產品主資料和Price list。 產品主資料 Hierarchy UI上按鈕New的enable/disable邏輯 SAP CRM和C4C資料同步的兩種方式概述:SAP PI和HCI 一種輕量級的C4C業務資料同步到S/4HANA的方式:Odata通知 如何啟用SAP C4C4

資料庫-DML(資料操作語言)DQL(資料查詢語言)

MySQL的儲存引擎 什麼是儲存引擎? 關係資料庫表是用於儲存和組織資訊的資料結構,可以將表理解為由行和列組成的表格,類似於Excel的電子表格的形式。有的表簡單,有的表複雜,有的表根本不用來儲存任何長期的資料,有的表讀取時非常快,但是插入資料時很差;而我們在實際開發過程

python資料分析06--Pandas資料歸整聚合重塑

在許多應用中,資料可能分散在許多檔案或資料庫中,儲存的形式也不不利利於分析,應採用聚 合、合併、重塑資料的方法進行處理。 一、層次化索引 層次化索引(hierarchical indexing)是pandas的一項重要功能,它使你能在一個軸上擁有多 個(兩個以上)索引級別。 In

資料開發面試Impalahive的比較(最全版)

Impala和hive的比較 Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢儲存在Hadoop的HDFS和HBase中的PB級大資料。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapReduce引擎,仍然是一

實驗三 表資料的插入、修改刪除

1、  開啟資料庫YGGL; Use yggl;   2、  向Employees表中插入一條記錄:000001 王林 大專 1966-01-23  1  8  中山路32-1-508  83355668  2; In

Oracle中distinct的用法例項以及Oracle distince 用法刪除重複資料

Oracle中distinct的用法例項 摘要: 此外,distinct 會對返回的結果集進行排序 所以會大大影響查詢效率,大資料集時比較明顯 。所以,最好和order by 結合使用,可以提高效率 。 select  distinct  a,b,c from t;表t裡列

vc檔案複製刪除及移動重新命名

總結一下SHFileOperation的用法,希望對大家有用 //刪除檔案或者資料夾bool DeleteFile(char * lpszPath) { SHFILEOPSTRUCT FileOp={0}; FileOp.fFlags = FOF_ALLOWUNDO |   //允許放回回收站    

jQuery 實現模組的複製刪除

//複製一個table function copyDiv(){var count = $("#family").find("table").length;if(count >= 3){alert("家庭成員新增不能超過3個!");}else{var table = $