使用到的API:
CreateDirectory:创建目录
FindFirstFile,FindNextFile 查找文件
RemoveDirectory:删除空目录
GetFileAttributes:获取文件属性
CreateSymbolicLink:创建符号链接
GetDriveType:获取盘符
SHFileOperation:拷贝文件

拷贝文件夹有两种方案,一种是通过SHFileOperation来拷贝,代码简洁,只需要填写SHFILEOPSTRUCT的参数就可以。另一种是用FindFirstFile,FindNextFile 查找文件递归去复制。

方法一

BOOL CopyFolder(LPTSTR pFrom, LPTSTR pTo)
{SHFILEOPSTRUCT FileOp={0};ZeroMemory(&FileOp, sizeof(SHFILEOPSTRUCT));FileOp.fFlags = FOF_NOCONFIRMATION| //不出现确认对话框FOF_NOCONFIRMMKDIR ; //需要时直接创建一个文件夹,不需用户确定//FileOp.fFlags = FOF_NO_UI;FileOp.pFrom = pFrom;FileOp.pTo = pTo;FileOp.wFunc = FO_COPY;if( SHFileOperation(&FileOp) == 0){cout<<" copy file success!!!"<<endl;return TRUE;}else{cout<<"copy file failed!!!  "<<endl;return FALSE;}
}

注意:当我尝试隐藏所有弹框(确认框,进度条,冲突选项等)FileOp.fFlags = FOF_NO_UI时。在拷贝较大的文件夹时会报错,返回值是32(进程无法访问文件,因为另一个程序正在使用此文件),用上面的参数就会弹出进度条,就不会报错。

方法二:
通过FindFirstFile,FindNextFile 递归查找文件,用copyfile复制文件,不会存在方法一的问题,还能拷贝隐藏文件,CreateDirectory创建头目录时,可以设置属性为只有当前用户可以访问。

BOOL CopyDir(LPTSTR pszSrcPath,LPTSTR pszDstPath)
{WIN32_FIND_DATA FindFileData;HANDLE hFind;TCHAR tmpsrc[256];_tcscpy(tmpsrc,pszSrcPath);_tcscat(tmpsrc,L"\\*.*");hFind = FindFirstFile(tmpsrc, &FindFileData);if(hFind == INVALID_HANDLE_VALUE)return FALSE;CreateDirectory(pszDstPath,NULL);do{TCHAR newdst[256];_tcscpy(newdst,pszDstPath);if(newdst[_tcslen(newdst)]!='\\')_tcscat(newdst,L"\\");_tcscat(newdst,FindFileData.cFileName);TCHAR newsrc[256];_tcscpy(newsrc,pszSrcPath);if(newsrc[_tcslen(newsrc)]!='\\')_tcscat(newsrc,L"\\");_tcscat(newsrc,FindFileData.cFileName);if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY){if(_tcscmp(FindFileData.cFileName,L".")!=0&&_tcscmp(FindFileData.cFileName,L"..")!=0)CopyDir(newsrc,newdst);}elseCopyFile(newsrc,newdst,TRUE);}while(FindNextFile(hFind,&FindFileData));FindClose(hFind);return TRUE;
}

判断是否文件夹,通过GetFileAttributes获取文件属性,文件夹是FILE_ATTRIBUTE_DIRECTORY属性,可能会是隐藏文件夹FILE_ATTRIBUTE_HIDDEN

BOOL IsDirectory(LPTSTR lpDirPath)
{DWORD dwRes = GetFileAttributes(lpDirPath);if(dwRes == INVALID_FILE_ATTRIBUTES){cout<<"GetFileAttributes failed"<<endl;return FALSE;}if( dwRes == (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY )|| dwRes == FILE_ATTRIBUTE_DIRECTORY )return TRUE;return FALSE;
}

创建只有当前用户有访问权限的文件夹
原理:获取当前用户名,通过LookupAccountName用户的psid,再通过AddAccessAllowedAce获取pacl,用SetSecurityDescriptorDacl设置SECURITY_DESCRIPTOR,最后配置SECURITY_ATTRIBUTES


BOOL IsDirExist(LPTSTR pszDir)
{DWORD dwAttrib = GetFileAttributes(pszDir);return INVALID_FILE_ATTRIBUTES != dwAttrib && 0 != (dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}BOOL CreateDir(LPTSTR pszDirName)
{if(IsDirExist(pszDirName))return FALSE;SECURITY_ATTRIBUTES sa;SECURITY_DESCRIPTOR sd;BYTE aclBuffer[1024];PACL pacl = (PACL)&aclBuffer;BYTE sidBuffer[100];PSID psid = (PSID)&sidBuffer;DWORD sidBufferSize = 100;TCHAR domainBuffer[80];DWORD domainBufferSize = 80;SID_NAME_USE snu;DWORD dwBufferSize = 100;TCHAR UserName[100];GetUserName(UserName,&dwBufferSize);InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);InitializeAcl(pacl,1024,ACL_REVISION);LookupAccountName(0,UserName,psid,&sidBufferSize,domainBuffer,&domainBufferSize,&snu);AddAccessAllowedAce(pacl,ACL_REVISION,GENERIC_ALL,psid);SetSecurityDescriptorDacl(&sd,TRUE,pacl,FALSE);sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.bInheritHandle = FALSE;sa.lpSecurityDescriptor = &sd;CreateDirectory(pszDirName,&sa);return TRUE;
}

文件夹拷贝,判断,生成当前用户权限的文件夹相关推荐

  1. 计算机用户权限完全控制,win10用户权限管理文件夹怎么设置_win10文件夹完全控制权限操作方法...

    在win10系统中,想要打开一些带有权限设置的文件时就需要用户获取一定的控制权限权利才行,同样的,用户也可以通过权限对文件夹进行完全控制管理,那么win10用户权限管理文件夹怎么设置呢?这里就来教大家 ...

  2. Oracle数据库:oracle 11g安装教程,已安装好的oracle各个文件夹的作用,oracle用户权限怎么样

    Oracle数据库:oracle 11g安装教程,已安装好的oracle各个文件夹的作用,oracle用户权限怎么样 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学 ...

  3. 【linux 06】 linux中的用户权限、文件权限与目录权限

    1.用户及用户组的概念: 1.文件所有者 2.用户组 3.用户 以root登录Linux之后,执行ls -al,会看到有关文件属性的信息 -rw-r--r--,第1个字符代表这个文件是"目录 ...

  4. 计算机内用户文件夹中的文件,在位于计算机上所有用户的AppData文件夹中的文件中修改一行...

    我想修改位于计算机上所有用户的AppData文件夹中的文件中的一行.在位于计算机上所有用户的AppData文件夹中的文件中修改一行 线在prefs.js文件来改变开始: user_pref(" ...

  5. linux里用于剪切文件,Linux_拷贝,剪切,删除和创建文件

    cp 你要拷贝的文件 + 目录/带路径的文件名(在拷贝的同时,让这个文件重新命名) cp /tep/dir01  ~  代表将dir01拷贝到当前用户的家目录中 cp /tep/dir02  ~/di ...

  6. linux文件下生成一个文件,Linux系统下生成一个指定大小的文件要注意什么?

    在装系统,因此在这里随便记点东西. 从前与经理讨论NVR项目的时候,他提到要预先将用户指定好的磁盘空间预留出来,这是比较容易实现的功能.不容易实现的是自己写一个文件系统,这种方法我是不太敢照量啊,不过 ...

  7. php生成文件index.html,Typecho生成静态首页index.html文件

    Typecho生成静态首页index.html文件 作者:佚名 来源:爱好者 时间:2019-11-02 在挨踢路看到的教程,不仅仅适用于Typecho,wordpress也是可以通用. 教程 在网站 ...

  8. 使用vagrant因用户权限导致文件不可写问题的解决

    我是在mac 下用vagrant,安装linux环境.(windows下也一样参考此方法) 如何做可参考https://liuzhichao.com/p/1940.html 或你自己多百度几篇. 通过 ...

  9. macbook没有权限打开文件_手把手教你删除没有权限的文件

    为什么我们没有权限? 在生活中,经常用电脑的朋友们一定遇到过这样的情况,删除一个文件时,遇到需要管理员授权才能查看或者删除的文件,这让人十分的苦恼,这不是要证明我就是我吗? 怎样获得权限? 首先,我们 ...

最新文章

  1. 2022-2028年中国电压力锅市场投资分析及前景预测报告
  2. [小技巧]在NTFS分区中复制文件的同时如何复制权限
  3. 资源调度框架YARN
  4. Good Technology 产品特色
  5. 泸州计算机专业学院,泸州计算机专业中职推荐
  6. Appium+PythonUI自动化之webdriver 的三种等待方式(强制等待、隐式等待、显示等待)
  7. Address already in use:JVM_Bind:8080
  8. python基础学习(四)if判断语句
  9. en60204标准_工业机械一般办理CE认证的标准
  10. SylixOS线程创建的流程分析
  11. java中是值传递引用传递_Java是按值传递而不是按引用传递
  12. Volley(五)—— 自定义Request
  13. CentOS7环境下编译Hadoop3.2.1源码
  14. windows11 这个男神到底值得用吗?——一个男神的传奇
  15. 关于『HTML』:第三弹
  16. QA:笔记本如何选?
  17. QQ是怎么实现通讯的
  18. 给大家介绍一个PDF图书下载网站,还有TXT图书下载
  19. localhost,127.0.0.1,本机IP
  20. HLG 1916 小Z的卡片 (set 难题)恏似系亚洲区噶题

热门文章

  1. 「独立站必备工具」25种检测竞争对手网站的分析工具
  2. linux内核路由转发表的组成,linux路由转发表的检索过程(fib_lookup)
  3. 美术初学者画速写人物遇到的问题有哪些
  4. 苹果手机换鸿蒙系统,鸿蒙横空出世了,换掉苹果机你愿意吗?
  5. python中占位符可以用什么_python占位符都有什么
  6. 平安好医生遭遇困局:六年亏近47亿元 价值百亿品牌或被舍弃
  7. 上海亚商投顾:市场呈现窄幅震荡 新能源类行业受热炒
  8. 如何读取MTK 平台IMEI , BT 和WIFI 地址
  9. 对中国Linux有杰出贡献的几位人物[转贴]
  10. Android-掷骰子