Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较两个文件夹的关系_C++_Windows_Visual Studio_Mfc - Fatal编程技术网

C++ 比较两个文件夹的关系

C++ 比较两个文件夹的关系,c++,windows,visual-studio,mfc,C++,Windows,Visual Studio,Mfc,场景 过程A从Web服务收集文件,并将其复制到根文件夹。有时会将文件复制到根目录的子文件夹中,例如: c:\root\file1 c:\root\file2 c:\root\filea c:\root\<unique random name>\fileA 现在的问题是:我对过程B没有任何控制,也不知道它什么时候结束过程B可以在存档每个单独的文件后调用用户函数 第二种解决方案(足够但不太有效) 我仍然可以调用上面的函数 DWORD DeleteEmptySubFolder(LPCST

场景

过程A从Web服务收集文件,并将其复制到根文件夹。有时会将文件复制到根目录的子文件夹中,例如:

c:\root\file1
c:\root\file2
c:\root\filea
c:\root\<unique random name>\fileA
现在的问题是:我对过程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;
}
也许这个解决方案在我的场景中可以很好地工作,但它只能处理文件夹/文件名一致的情况。例如:

c:\root\file1
c:\root\file2
c:\root\filea
c:\root\<unique random name>\fileA
本地磁盘:

root: C:\folder\
filename: c:\folder\subfolder\fileA
映射磁盘:

root: Z:\folder\
filename: Z:\folder\subfolder\fileA
联合国军司令部:

现在我的问题太笼统和抽象了,我能在最坏的情况下检查两个文件夹的层次结构/关系吗

\\server\folder1\folder2 (UNC)
z:\folder2 (network drive).
甚至是最糟糕的

\\MYPC\folder1\folder2
c:\folder2
也许我问了一个有点反常的问题。。。但这很有挑战性,也很有趣,不是吗


非常感谢。

我改进了第三种解决方案;它可以解决几种情况,但却不能处理所有可能的情况

#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;
}
以及:


“攻击”这个问题的第一步是访问stackoverflow.com,在这里发布你的第一个问题之前,先回答问题,然后再学习问题。通过这种方式,您将知道stackoverflow.com上需要问什么样的问题才能得到有用的答案,而不是被否决和关闭,因为这是不可能的(而且您还需要简化硬链接和重定向)。这感觉像是一个XY问题,即你为什么需要知道文件夹嵌套?不是一个完整的答案,但看看我认为你的问题主要集中在第三个例子。我尝试使用MD5来区分这一点,因为文件夹没有MD5,所以我比较了文件夹的内容,以确定网络共享文件夹是否与本地文件夹相同。但我也发现了一个问题,那就是,如果我的电脑上有两个相同的文件夹,文件夹的内容会被复制,所以MD5是相同的,两个文件夹都是共享的,那么我们如何区分哪个文件夹是?@RichardCritenyes,我想可能是一个XY问题,我正试图为一个过于抽象和过于一般的问题找到一个超级解决方案。我将重新考虑整个问题,然后重新编辑这个问题。非常感谢。
#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_PC\shared_folder\folderA
folder B: C:\shared_folder
(\\MY_PC\shared_folder and C:\shared_folder are the sane folder)
folder A: \\SERVER\shared_folderA\shared_folderB
folder B: \\SERVER\shared_folderB