C++ 如何检查特定文件夹中是否存在任何文件?

C++ 如何检查特定文件夹中是否存在任何文件?,c++,windows,file,winapi,mfc,C++,Windows,File,Winapi,Mfc,我正在使用CreateProcess复制文件。此外,我可以捕捉不同的错误,如果电脑脱机,如果目录不存在。 我遇到的问题是:如果所有复制都成功,它将返回0作为错误代码,如果源文件夹中没有文件,它也将返回0,因此不会进行复制。我必须检测源文件夹中是否没有文件。如何在MFC VC++2013中执行此操作 我花了数小时尝试不同的解决方案,但我的知识还不足以实现我在互联网上找到的所有解决方案。所以我必须要代码,然后我才能理解。先谢谢你 这是我使用的代码: temp_dest = _T("/min /c x

我正在使用CreateProcess复制文件。此外,我可以捕捉不同的错误,如果电脑脱机,如果目录不存在。 我遇到的问题是:如果所有复制都成功,它将返回0作为错误代码,如果源文件夹中没有文件,它也将返回0,因此不会进行复制。我必须检测源文件夹中是否没有文件。如何在MFC VC++2013中执行此操作

我花了数小时尝试不同的解决方案,但我的知识还不足以实现我在互联网上找到的所有解决方案。所以我必须要代码,然后我才能理解。先谢谢你

这是我使用的代码:

temp_dest = _T("/min /c xcopy \"D:\\Test\\*.*\" \"") + m_destination + _T("\" /Y /E /Q");
LPTSTR temp_dest2 = (LPTSTR)(LPCTSTR)temp_dest;
STARTUPINFO            sinfo;
PROCESS_INFORMATION    pinfo;
memset(&sinfo, 0, sizeof(STARTUPINFO));
memset(&pinfo, 0, sizeof(PROCESS_INFORMATION));
sinfo.dwFlags = STARTF_USESHOWWINDOW;
sinfo.wShowWindow = SW_HIDE;
BOOL bSucess = CreateProcess(L"C:\\Windows\\System32\\cmd.exe", temp_dest2, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &sinfo, &pinfo);
DWORD dwCode;
TerminateProcess(pinfo.hProcess, 2);
GetExitCodeProcess(pinfo.hProcess, &dwCode);
TCHAR msg2[100];
StringCbPrintf(msg2, 100, TEXT("%X"), dwCode); 
MessageBox(msg2, (LPCWSTR)L"DWCode 2", MB_OK | MB_ICONERROR);
if (dwCode == 4)
{
    MessageBox((LPCWSTR)L"DW 4", (LPCWSTR)L"Path not found", MB_OK | MB_ICONERROR);
}
if (dwCode == 2)
{
    MessageBox((LPCWSTR)L"DW 4", (LPCWSTR)L"PC Offline", MB_OK | MB_ICONERROR);
}

您可以使用WIN32函数检查文件是否存在:

if (GetFileAttributes("C:\\test.txt") != INVALID_FILE_ATTRIBUTES)
{
    /* C:\test.txt is existing */
}
另一种方法可能是尝试打开该文件,如果成功,则再次关闭它。

如果您可以使用C++17中引入的头文件中的目录迭代器:

bool IsEmptyDirectory( const wchar_t* dir )
{
    return std::filesystem::directory_iterator( std::filesystem::path( dir ) )
            == std::filesystem::directory_iterator();
}
可能需要std::experimental::filesystem而不是std::filesystem

我曾尝试将其移植到VC2013,但似乎只有char版本可以编译

bool IsEmptyDirectory( const char* dir )
{
    return std::tr2::sys::directory_iterator( std::tr2::sys::path( dir ) )
            == std::tr2::sys::directory_iterator();
}
如果您想要或必须使用WinAPI:

bool IsEmptyDirectory( const wchar_t* dir )
{
    wstring mask( dir);
    mask += L"\\*";

    WIN32_FIND_DATA data;
    HANDLE  find_handle = FindFirstFile( mask.c_str(), &data );
    if ( find_handle == INVALID_HANDLE_VALUE )
    {
        // Probably there is no directory with given path.
        // Pretend that it is empty.
        return true;
    }

    bool empty = true;
    do
    {
        // Any entry but . and .. means non empty folder.
        if ( wcscmp( data.cFileName, L"." ) != 0 && wcscmp( data.cFileName, L".." ) != 0 )
            empty = false;
    } while ( empty && FindNextFile( find_handle, &data ) );

    FindClose( find_handle );

    return empty;
}

c++17必须从代码中复制,而不是依赖外部命令。这将比bat文件简单得多。它需要C++的任何原因吗?看看你能不能摆脱T和所有TChar混乱。使用Unicode版本,而不是当前混合使用的宽字符和T字符,然后使用它。这样可以减少令人讨厌的意外。如果所有复制都成功,它将返回0作为错误代码,如果源文件夹中没有文件,它也将返回0,因此不会进行复制。首先,这怎么算失败?如果源文件夹中没有文件,则无法进行复制。第二,你的整个设计都是一个很好的例子。如果在检查文件是否存在后删除了任何文件,会发生什么情况?如果在找不到文件后添加了文件,会发生什么情况?我正在使用CreateProcess复制文件-为什么?您可以改为使用SHFileOperation或IFileOperation,不需要单独处理。@Luke Thomsen如果文件名未知,我是否可以以某种方式使用GetFileAttributes?使用类似**的东西不,你不能。如果你想搜索像这样的模式。请看一下FindFirstFile。。和FindNextFile。。允许您搜索目录中现有文件的函数。@Luke Thomsen好的,我现在知道了。。。我终于找到了。。。由于源路径是静态的,但文件名是动态的,所以我可以使用以下代码WIN32_FIND_DATA findFileData;处理高频风;hFind=FindFirstFileLC:\\*.*,&findFileData;如果hFind!=无效的_HANDLE_值{MessageBoxfindFileData.cFileName,LPCWSTRLFajl 1,MB|OK | MB|icontrol;}请注意,当文件存在但您无权读取其属性时,GetFileAttributes可能会失败,但不太可能出现错误_ACCESS_DENIED。因此,您应该检查该条件,例如:if GetFileAttributeEsc:\\test.txt!=无效的_FILE_ATTRIBUTES | | GetLastError==ERROR_ACCESS_DENIED与打开文件相同。@RemyLebeau感谢您提供的信息,但我认为访问被拒绝是不可能的,因为在复制之前,我正在为管理员帐户temp_cred=\u T/min/c cmdkey/add:PC_NAME.SUBDOMAIN.DOMAIN.local/user:admin/pass:text添加windows凭据;ShellExecuteTasafehwnd,打开,LC:\\Windows\\System32\\cmd.exe,temp\u cred,NULL,SW\u HIDE;