码迷,mamicode.com
首页 > 其他好文 > 详细

自己写的几个关于文件夹操作的函数

时间:2015-05-30 17:55:50      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

自己写了几个关于文件夹操作的函数,代码如下:

/////////////////////////////////////////
//     删除目录及子目录下所有文件         //
/////////////////////////////////////////

BOOL DeleteAllFileFromDirectoryW(LPCWSTR lpPath)
{
    HANDLE hFind;
    WCHAR wzDeletePath[MAX_PATH] = { 0 };
    WIN32_FIND_DATA findFileData;

    ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA));
    
    //切换到要删除的路径
    //
    _wchdir(lpPath);

    //检查路径是否以“\”结尾
    //
    wcscpy_s(wzDeletePath, MAX_PATH, lpPath);
    if (L\\ != wzDeletePath[wcslen(wzDeletePath) - 1])
    {
        wcscat_s(wzDeletePath, MAX_PATH, L"\\");
    }

    //在路径后面添加通配符“*.*”
    //
    wcscat_s(wzDeletePath, MAX_PATH, L"*.*");

    //寻找第一个文件
    //
    hFind = FindFirstFileW(wzDeletePath, &findFileData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        //错误提示,路径不存在
        return FALSE;
    }

    //开始遍历
    //
    do 
    {
        wcscpy_s(wzDeletePath, MAX_PATH, lpPath);
        wcscat_s(wzDeletePath, MAX_PATH, L"\\");
        wcscat_s(wzDeletePath, MAX_PATH, findFileData.cFileName);

        //如果是目录,过滤掉“.”和“..”目录,递归遍历
        //
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if ((0 == wcscmp(L".", findFileData.cFileName)) || (0 == wcscmp(L"..", findFileData.cFileName)))
            {
                continue;
            }

            //递归遍历
            DeleteAllFileFromDirectoryW(wzDeletePath);
        }
        //文件,直接删除
        //
        else
        {
            if (!DeleteFileW(wzDeletePath))
            {
                //错误输出,删除文件失败
                continue;
            }
        }

    } while (FindNextFileW(hFind, &findFileData));

    FindClose(hFind);

    //文件夹遍历完毕后切换到父文件夹,删除此文件夹
    //
    _wchdir(L"..");
    if (!RemoveDirectoryW(lpPath))
    {
        //错误输出,删除文件夹失败
        return FALSE;
    }

    return TRUE;
}


///////////////////////////////////////////
//    目录拷贝(目录下包含子目录)        ////
///////////////////////////////////////////

BOOL CopyDirectoryW(LPCWSTR lpSrcDir, LPCWSTR lpDesDir)
{
    HANDLE hFind;
    WCHAR wzSrcDir[MAX_PATH] = { 0 };
    WCHAR wzDesDir[MAX_PATH] = { 0 };
    WCHAR wzTemp[MAX_PATH] = { 0 };
    WIN32_FIND_DATA findFileData;

    ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA));

    //检查路径是否以“\”结尾
    //
    wcscpy_s(wzSrcDir, MAX_PATH, lpSrcDir);
    if (L\\ != wzSrcDir[wcslen(wzSrcDir) - 1])
    {
        wcscat_s(wzSrcDir, MAX_PATH, L"\\");
    }

    //在路径后面添加通配符“*.*”
    //
    wcscat_s(wzSrcDir, MAX_PATH, L"*.*");

    //寻找第一个文件
    //
    hFind = FindFirstFileW(wzSrcDir, &findFileData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        //错误提示,路径不存在
        return FALSE;
    }

    //开始遍历
    //
    do
    {
        wcscpy_s(wzSrcDir, MAX_PATH, lpSrcDir);
        wcscat_s(wzSrcDir, MAX_PATH, L"\\");
        wcscat_s(wzSrcDir, MAX_PATH, findFileData.cFileName);

        wcscpy_s(wzDesDir, MAX_PATH, lpDesDir);
        wcscat_s(wzDesDir, MAX_PATH, L"\\");
        wcscat_s(wzDesDir, MAX_PATH, findFileData.cFileName);

        //如果是目录,过滤掉“.”和“..”目录,递归遍历
        //
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if ((0 == wcscmp(L".", findFileData.cFileName)) || (0 == wcscmp(L"..", findFileData.cFileName)))
            {
                continue;
            }

            //创建目标目录
            if (!PathFileExistsW(wzDesDir))
            {
                if (!CreateDirectoryW(wzDesDir, NULL))
                {
                    //错误输出,创建目录失败
                    continue;
                }
            }
            //递归遍历
            CopyDirectoryW(wzSrcDir, wzDesDir);
        }
        //文件,直接拷贝
        //
        else
        {
            if (!CopyFileW(wzSrcDir, wzDesDir, TRUE))
            {
                //错误输出,拷贝文件失败
                continue;
            }
        }

    } while (FindNextFileW(hFind, &findFileData));

    FindClose(hFind);

    return TRUE;
}


////////////////////////////////////////
//    目录移动(目录下包含子目录)     ////
/////////////////////////////// ////////

BOOL MoveDirectoryW(LPCWSTR lpSrcDir, LPCWSTR lpDesDir)
{
    HANDLE hFind;
    WCHAR wzSrcDir[MAX_PATH] = { 0 };
    WCHAR wzDesDir[MAX_PATH] = { 0 };
    WCHAR wzTemp[MAX_PATH] = { 0 };
    WIN32_FIND_DATA findFileData;

    ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA));

    //切换到要移动的路径
    //
    _wchdir(lpSrcDir);

    //检查路径是否以“\”结尾
    //
    wcscpy_s(wzSrcDir, MAX_PATH, lpSrcDir);
    if (L\\ != wzSrcDir[wcslen(wzSrcDir) - 1])
    {
        wcscat_s(wzSrcDir, MAX_PATH, L"\\");
    }

    //在路径后面添加通配符“*.*”
    //
    wcscat_s(wzSrcDir, MAX_PATH, L"*.*");

    //寻找第一个文件
    //
    hFind = FindFirstFileW(wzSrcDir, &findFileData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        //错误提示,路径不存在
        return FALSE;
    }

    //开始遍历
    //
    do
    {
        wcscpy_s(wzSrcDir, MAX_PATH, lpSrcDir);
        wcscat_s(wzSrcDir, MAX_PATH, L"\\");
        wcscat_s(wzSrcDir, MAX_PATH, findFileData.cFileName);

        wcscpy_s(wzDesDir, MAX_PATH, lpDesDir);
        wcscat_s(wzDesDir, MAX_PATH, L"\\");
        wcscat_s(wzDesDir, MAX_PATH, findFileData.cFileName);

        //如果是目录,过滤掉“.”和“..”目录,递归遍历
        //
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if ((0 == wcscmp(L".", findFileData.cFileName)) || (0 == wcscmp(L"..", findFileData.cFileName)))
            {
                continue;
            }

            //创建目标目录
            if (!PathFileExistsW(wzDesDir))
            {
                if (!CreateDirectoryW(wzDesDir, NULL))
                {
                    //错误输出,创建目录失败
                    continue;
                }
            }
            //递归遍历
            MoveDirectoryW(wzSrcDir, wzDesDir);
        }
        //文件,直接移动
        //
        else
        {
            if (!MoveFileW(wzSrcDir, wzDesDir))
            {
                //错误输出,移动文件失败
                continue;
            }
        }

    } while (FindNextFileW(hFind, &findFileData));

    FindClose(hFind);

    //文件夹遍历完毕后切换到父文件夹,删除此文件夹
    //
    _wchdir(L"..");
    if (!RemoveDirectoryW(lpSrcDir))
    {
        //错误输出,删除文件夹失败
        return FALSE;
    }
    return TRUE;
}

 

自己写的几个关于文件夹操作的函数

标签:

原文地址:http://www.cnblogs.com/danjing/p/4540680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!