我是 C 和 winapi 的新手,目前正在研究一個專案,以創建一個具有將一個驅動器中的所有檔案 .doc 和 .docx 復制到另一個檔案夾的功能的 winapi 應用程式。以下是我所做的,但似乎不起作用:
誰能告訴我如何正確地做到這一點?
void cc(wstring inputstr) {
TCHAR sizeDir[MAX_PATH];
wstring search = inputstr TEXT("\\*");
wcscpy_s(sizeDir, MAX_PATH, search.c_str());
WIN32_FIND_DATA findfiledata;
HANDLE Find = FindFirstFile(sizeDir, &findfiledata);
do {
if (findfiledata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (!wcscmp(findfiledata.cFileName, TEXT(".")) || !wcscmp(findfiledata.cFileName, TEXT(".."))) continue;
//checking folder or file
wstring dirfolder = inputstr TEXT("\\") findfiledata.cFileName;
cc(dirfolder);
}
else {
wstring FileSearch = findfiledata.cFileName;
//.doc or docx
if (!wcscmp(FileSearch.c_str(), L".doc") || !wcscmp(FileSearch.c_str(), L".docx")) {
TCHAR src[256] = L"D:\\test\\";
wstring dirsrc = inputstr TEXT("\\") findfiledata.cFileName;
_tprintf(TEXT(" %s \n"), dirsrc.c_str());
wcscat_s(src, findfiledata.cFileName);
CopyFile(dirsrc.c_str(), src, TRUE);
}
}
} while (FindNextFile(Find, &findfiledata) != 0);
FindClose(Find);
}
inputstr當我呼叫該函式時,這里是我想要搜索的驅動器cc(L"D:");
uj5u.com熱心網友回復:
if (!wcscmp(FileSearch.c_str(), L".doc") || !wcscmp(FileSearch.c_str(), L".docx"))
這是比較整個檔案名。我們只需要比較檔案擴展名。PathFindExtension可用于查找檔案擴展名:
const wchar_t* ext = PathFindExtension(findfiledata.cFileName);
if (_wcsicmp(ext, L".doc") == 0 || _wcsicmp(ext, L".docx") == 0)
{
const std::wstring path = inputstr L"\\" findfiledata.cFileName;
std::wcout << path << '\n';
}
findfiledata 應該是零初始化。
CopyFile在該遞回函式中添加可能會導致問題。因為FindNextFile可以看到新復制的檔案,并且該函式嘗試再次復制它。
您可以改為將結果保存在字串向量中,然后在cc完成后復制檔案。
void cc(const std::wstring &inputstr, std::vector<std::wstring> &vec)
{
std::wstring wildcard{ inputstr L"\\*" };
WIN32_FIND_DATA find = { 0 };
HANDLE handle = FindFirstFile(wildcard.c_str(), &find);
if (handle == INVALID_HANDLE_VALUE)
return;
do
{
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (!wcscmp(find.cFileName, L".") || !wcscmp(find.cFileName, L".."))
continue;
const std::wstring dir = inputstr L"\\" find.cFileName;
cc(dir, vec);
}
else
{
const wchar_t* ext = PathFindExtension(find.cFileName);
if (_wcsicmp(ext, L".doc") == 0 || _wcsicmp(ext, L".docx") == 0)
{
const std::wstring path = inputstr L"\\" find.cFileName;
vec.push_back(path);
}
}
} while (FindNextFile(handle, &find) != 0);
FindClose(handle);
}
用作
std::vector<std::wstring> result;
cc(L"D:\\test", result);
for (const auto& e : result)
std::wcout << e << '\n';
注意,PathFindExtension需要額外的頭檔案和庫。如果由于某種原因它不可用,并且std::filesystem不可用,這里是一個自己動手的方法:
std::wstring test = findfiledata.cFileName;
auto dot = test.find_last_of(L'.');
if (dot != std::wstring::npos)
{
auto ext = test.substr(dot);
for (auto& e : ext) e = towlower(e);
if (ext == L".doc" || ext == L".docx")
{
std::wstring path = inputstr L"\\" findfiledata.cFileName;
std::wcout << path << '\n';
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/376680.html
