比较两个文件夹的关系
Compare relationship of two folder
SCENARIO
过程 A从 Web 服务收集文件,并将其复制到根文件夹。有时文件被复制到根目录的子文件夹中,例如:
c:rootfile1
c:rootfile2
c:rootfilea
c:root<unique random name>fileA
我怀疑(但我不确定(网络服务在 linux 系统上运行,文件名区分大小写。因此,文件被复制到Windows文件系统上,当发生大写/小写冲突时,文件被复制到子文件夹中。子文件夹具有随机生成的唯一名称。
过程 B扫描根文件夹和子文件夹中的文件以将其存档。正确存档的文件将被删除。过程 A和过程 B不会同时运行。
现在我的任务...我必须删除根目录的空子文件夹。
第一个解决方案(最简单的一个(
当过程B结束时,我可以扫描根目录的空子文件夹,结束然后删除它们。井。。。
DWORD DeleteEmptySubFolder(LPCSTR szRootFolder)
{
DWORD dwError = 0;
CString sFolder(szRootFolder);
sFolder += "*.*";
CFileFind find_folder;
BOOL bWorking = find_folder.FindFile(sFolder);
while (bWorking)
{
bWorking = find_folder.FindNextFile();
if(find_folder.IsDots())
continue;
if(find_folder.IsDirectory())
{
if(PathIsDirectoryEmpty(find_folder.GetFilePath()))
if(!RemoveDirectory(find_folder.GetFilePath()))
dwError = GetLastError();
}
}
return dwError;
}
现在问题来了:我对程序B没有任何控制权,我不知道它什么时候结束。过程 B可以在存档每个单独的文件后调用用户函数。
第二种解决方案(足够但不太有效(
我仍然可以调用上面的函数
DWORD DeleteEmptySubFolder(LPCSTR szRootFolder)
这肯定效率不高,它会扫描根目录的所有子文件夹以查找每个存档文件,但它只会删除空子文件夹。
第三种解决方案(它应该有效(
当过程B调用用户函数时,我知道存档文件的根文件夹和完整路径。所以我可以检查文件的文件夹是否是根目录的子文件夹:
#define EQUAL_FOLDER 0
#define A_SUBFOLDER_OF_B 1
#define B_SUBFOLDER_OF_A 2
#define UNRELATED_FOLDER 3
int CompareFolderHiearachy(LPCSTR szFolderA, LPCSTR szFolderB)
{
if(_stricmp(szFolderA, szFolderB))
{
// StrStrI - Windows function (from shlwapi.dll) which finds the first occurrence of a substring within a string (the comparison is not case-sensitive).
if(StrStrI(szFolderA, szFolderB) == szFolderA)
return A_SUBFOLDER_OF_B;
else if(StrStrI(szFolderB, szFolderA) == szFolderB)
return B_SUBFOLDER_OF_A;
else
return UNRELATED_FOLDER;
}
else
return EQUAL_FOLDER;
}
也许这个解决方案在我的场景中可以正常工作,但它只能处理文件夹/文件名一致的情况。例如:
本地磁盘:
root: C:folder
filename: c:foldersubfolderfileA
映射磁盘:
root: Z:folder
filename: Z:foldersubfolderfileA
北卡:
root: \SERVERfolder
filename: \SERVERfoldersubfolderfileA
现在我太笼统和抽象的问题,我可以在最坏的情况下检查两个文件夹的层次结构/现实吗?
\serverfolder1folder2 (UNC)
z:folder2 (network drive).
甚至最糟糕....
\MYPCfolder1folder2
c:folder2
也许我问了一个有点反常的问题...但这非常具有挑战性和耐人寻味,不是吗?
谢谢。
我改进了 thrid 解决方案;它可以解决多种情况,但不幸的是它无法处理所有可能的情况。
#define ERROR_OCCURED -1
#define EQUAL_FOLDER 0
#define A_SUBFOLDER_OF_B 1
#define B_SUBFOLDER_OF_A 2
#define UNRELATED_FOLDER 3
int CompareFolderHiearachy(LPCSTR szFolderA, LPCSTR szFolderB)
{
char pBuffer[32767];
DWORD dwBufferLength = 32767;
UNIVERSAL_NAME_INFO * unameinfo = reinterpret_cast< UNIVERSAL_NAME_INFO *>(pBuffer);
DWORD dwRetVal = WNetGetUniversalName(szFolderA, UNIVERSAL_NAME_INFO_LEVEL, reinterpret_cast<LPVOID>(pBuffer), &dwBufferLength);
if(dwRetVal != NO_ERROR && dwRetVal != ERROR_NOT_CONNECTED && dwRetVal != ERROR_BAD_DEVICE)
return ERROR_OCCURED;
CString sFolderA(unameinfo->lpUniversalName ? unameinfo->lpUniversalName : szFolderA);
ZeroMemory(pBuffer, dwBufferLength);
dwRetVal = WNetGetUniversalName(szFolderB, UNIVERSAL_NAME_INFO_LEVEL, reinterpret_cast<LPVOID>(pBuffer), &dwBufferLength);
if(dwRetVal != NO_ERROR && dwRetVal != ERROR_NOT_CONNECTED && dwRetVal != ERROR_BAD_DEVICE)
return ERROR_OCCURED;
CString sFolderB(unameinfo->lpUniversalName ? unameinfo->lpUniversalName : szFolderB);
if(_stricmp(sFolderA, sFolderB))
{
// StrStrI - Windows function (from shlwapi.dll) which finds the first occurrence of a substring within a string (the comparison is not case-sensitive).
if(StrStrI(sFolderA, sFolderB) == static_cast<LPCSTR>(sFolderA))
return A_SUBFOLDER_OF_B;
else if(StrStrI(szFolderB, sFolderA) == static_cast<LPCSTR>(sFolderB))
return B_SUBFOLDER_OF_A;
else
return UNRELATED_FOLDER;
}
else
return EQUAL_FOLDER;
}
它无法解决以下问题:
folder A: \MY_PCshared_folderfolderA
folder B: C:shared_folder
(\MY_PCshared_folder and C:shared_folder are the sane folder)
和:
folder A: \SERVERshared_folderAshared_folderB
folder B: \SERVERshared_folderB
相关文章:
- 如何将更多文件夹添加到c++include路径
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何在文档文件夹中创建目录
- "assimp/config.h"找不到,但它在文件夹中
- C++入门 5 版:类消息和文件夹
- 我可以在 Arduino 的库文件夹之外安装库吗?
- 如何按文件扩展名引用文件夹中的文件
- 在QTreeView中仅显示共享驱动器和文件夹
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- 介子复制/安装头文件到输出目录并保持文件夹结构
- vcruntime.h 从 Windows 包含文件夹中丢失?
- 在文件夹迭代上实现 RAII
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 使文件夹中的所有文件可供所有项目(子目录)访问
- 无法使用 CMake 从其他文件夹添加源文件
- 如何在安卓工作室中将c ++头文件从一个文件夹导入到另一个文件夹?
- 如何从Windows控制台调用.exe(C++)以在不同的目录(或任何目录)中创建文件夹?
- 比较两个文件夹的关系