两个自己函数创建目录和删除目录,考虑了多级目录的情况

  使用shell api的话删除目录和创建目录都是非常简单的一个函数调用就可以,但是如果是使用为win32里面基本的函数的话,就稍微会复杂点。不过个人感觉shell api里面删除和创建目录的函数也是调用win32里面这些基本的函数。

  创建目录, 可以创建多级目录,代码拷过去稍稍修改可用:

int IPath::SetDirectory(LPCTSTR lptStr)
{

    _stprintf_s(IPath::s_tszPath, _T("%s"), lptStr );
    char* szPath=NULL;
    W2C(&szPath, lptStr);
    strcpy_s(IPath::s_szPath, szPath);
    SAFE_ARRYDELETE(szPath);

    //TCHAR* tszPath = IPath::s_tszPath;
    TCHAR tszPath[MAX_PATH] = {0x0};
    _tcscpy_s(tszPath, IPath::s_tszPath);
    TCHAR* ptszTok = _tcstok(tszPath, _T("\\"));

    TCHAR tszTempPath[MAX_PATH] = {‘\0‘};

    while(ptszTok != NULL)
    {
        int pos = 0; //记录当前文件上一次目录结束位置(字符串中)
        if (tszTempPath[0] == ‘\0‘)
        {
            _tcscpy_s(tszTempPath, ptszTok);
        }
        else
        {
            pos = _tcslen(tszTempPath);
            _stprintf_s(tszTempPath, _T("%s\\%s"), tszTempPath, ptszTok);
        }

        //res 0: 文件存在,
        //      1:创建成功
        //      -1:创建失败
        int res = 0;
        if (!CreateDirectory(tszTempPath, NULL))
        {
            if (GetLastError() == ERROR_ALREADY_EXISTS)
                //文件夹已经存在
                res = 0;
            else
                //创建失败
                res = -1;
        }
        else
            res = 1;

        if (res >= 0)
        {
            //创建成功 或者文件存在
            ptszTok =  _tcstok(NULL, _T("\\"));
        }
        else
        {
            //创建失败后 处理可以 删除 之前已经创建的
            tszTempPath[pos] = ‘\0‘;
            RemoveDirectory(tszTempPath);
            return DB_FAILED;

        }
    }

    return DB_OK;

}

  删除目录,RemoveDirectory函数只能删除空文件夹, 所以伤处文件夹之前必须删除其子文件夹和文件,下面代码使用递归方法:

BOOL IPath::DeleteFolder(LPCTSTR lpstrFolder)
{
    TCHAR tszFind[MAX_PATH] = {0x0};
    WIN32_FIND_DATA wfd;
    BOOL bRet ;
    _tcscpy_s(tszFind, MAX_PATH, lpstrFolder);
    _tcscat_s(tszFind, _T("\\*.*"));

    HANDLE hFind  = FindFirstFile(tszFind, &wfd);

    if (INVALID_HANDLE_VALUE == hFind)
    {
        return FALSE;
    }
    bRet = TRUE;
    //遍历文件夹进行删除
    while (bRet)
    {
        bRet = FindNextFile(hFind, &wfd);
        //不是当前目录或者父目录
        if (!bRet)
        {
            break;
        }
        _tcscpy_s(tszFind, MAX_PATH, lpstrFolder);
        _tcscat_s(tszFind, _T("\\"));
        _tcscat_s(tszFind, wfd.cFileName);

        if (wfd.cFileName[0] != _T(‘.‘))
        {
#if _DEBUG
            TCHAR tszPath[MAX_PATH] = {0x0};
            wsprintf(tszPath,_T("%s\\%s\n"), lpstrFolder, wfd.cFileName);
            OutputDebugString(tszPath);
#endif
            if (wfd.dwFileAttributes &  FILE_ATTRIBUTE_DIRECTORY)
            {
                //普通目录
                DeleteFolder(tszFind);
            }
            else
            {
                if (!DeleteFile(tszFind))
                {
                    OutputDebugStringA("Delete fie failed \n");
                    FindClose(hFind);
                    return FALSE;
                }
                //文件
            }
        }
        else
            continue;
    }
    FindClose(hFind);
    return  RemoveDirectory(lpstrFolder);
}

两个自己函数创建目录和删除目录,考虑了多级目录的情况

时间: 2024-07-30 20:05:47

两个自己函数创建目录和删除目录,考虑了多级目录的情况的相关文章

创建目录和删除目录

命令:mkdir   ;  rmdir  :  tree mkdir ----make directory 语法: mkdir [-mp] [目录名称] mkdir 如果后面不加选项,直跟目录,会在最后目录的上一级建立子目录,若上一级不存在则不能建立,即不能建立一连串的目录. 如要建立一连串目录,可使用 mkdir -p [目录名称]  .  mkdir -v [目录名称]  意思是建立过程可视化. [[email protected] ~]# mkdir 234 [[email protect

javascript两种声明函数的方式的一次深入解析

声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME = function() { /* FUNCTION_BODY */}; /*方式二*/ function FUNCTION_NAME () { /* FUNCTION_BODY */}; 区别一 方式一的声明方式是先声明后使用 方式二的声明方式可以先调用,后声明 /*方式一: *先声明后使用 *

JS里面的两种运动函数

最新学了一个新的运动函数,与最初学习的有所不同,第一个运动是根据运动速度完成运动 ,第二个则是根据运动的时间来完成运动,而且把之前的函数都进行了一些兼容处理,在这里列出了看一下: 第一种animate1 1 function animate1(obj,data,rate,fn){//运动对象,运动数据,[运动速度],[回调函数] 2 //遍历获取样式属性 3 for(var key in data){ 4 //通过闭包将key私有化 5 (function(k){ 6 /* 7 获得样式宽高等会

Delphi中的操作二进制文件的两个重要函数

Delphi中的操作二进制文件的两个重要函数 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家.(申明:非本人所写) 1. 将Byte数组生成文件 procedure ByteArrayToFile(const ByteArray : TByteDynArray; const FileName : string );var Count: integer; F: FIle of B

简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数

[cpp] view plain copy //例如CNewListBox继承自CListBox,重载虚MeasureItem和DrawItem这两个虚函数,代码如下: void CNewListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX); L

js两种定义函数、继承方式及区别

一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function() { alert("i am B"); } 区别:code 前者会在代码执行之前提前加载到作用域中,后者则是在代码执行到那一行的时候才会有定义 二:js两种继承方式及区别 对象冒充 临时属性 call() apply() 原型链 code 继承应选哪种 code 三:实例 js两种定义

输入一个正数x和一个正整数n,求下列算式的值。要求定义两个调用函数:fact(n)计算n的阶乘;mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double

题目描述 输入一个正数x和一个正整数n,求下列算式的值.要求定义两个调用函数:fact(n)计算n的阶乘:mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double. x - x2/2! + x3/3! + ... + (-1)n-1xn/n! ×输出保留4位小数. 输入 x n 输出 数列和 样例输入 2.0 3 样例输出 1.3333 提示 无 来源 无 1 #include<stdio.h> 2 double fact(int); 3 double mypow(in

Delphi阿里云存储对象【支持上传文件、下载文件、删除文件、创建目录、删除目录、Bucket操作等】

Delphi阿里云存储对象             阿里云api文档 [Delphi阿里云存储对象]支持 获取Bucket列表.设置Bucket权限).创建Bucket.删除Bucket.获取文件列表.上传文件.下载文件.删除文件.读取文件.判断文件是否存在.创建目录.删除目录等功能 原文地址:https://www.cnblogs.com/zhimamaigua/p/11020392.html

Delphi - TIdFTP 两个重要函数

TIdFTP 两个重要函数 项目开发过程中发现,直接对于服务器上的文件/路径进行处理,是很危险的事情,因为一旦文件/路径不存在,程序就会抛异常,影响客户体验.所以在对服务器上的文件/路径进行访问之前,我们一般先判断服务器上是否存在某个路径/文件,然后再进行进一步的处理. 判断服务器上文件或者路径是否存在 FtpDirectoryExists 请看如下代码: 1 function TMainFrm.FtpDirectoryExists(ADir: string): Boolean; 2 var 3