void UnitFileNamesTest() { _ASSERTE(IsDotsName(L".")); _ASSERTE(IsDotsName(L"..")); _ASSERTE(!IsDotsName(L"...")); _ASSERTE(!IsDotsName(L"")); struct { LPCWSTR asPath, asPart1, asPart2, asResult; } Tests[] = { {L"C:", L"Dir", L"File.txt", L"C:\\Dir\\File.txt"}, {L"C:\\", L"\\Dir\\", L"\\File.txt", L"C:\\Dir\\File.txt"}, {L"C:\\", L"\\File.txt", NULL, L"C:\\File.txt"}, {L"C:", L"\\File.txt", NULL, L"C:\\File.txt"}, {L"C:\\", L"File.txt", NULL, L"C:\\File.txt"}, {NULL} }; bool bCheck; wchar_t* pszJoin; for (size_t i = 0; Tests[i].asPath; i++) { pszJoin = JoinPath(Tests[i].asPath, Tests[i].asPart1, Tests[i].asPart2); bCheck = (pszJoin && (lstrcmp(pszJoin, Tests[i].asResult) == 0)); _ASSERTE(bCheck); SafeFree(pszJoin); } bCheck = true; }
void FindFiles(LPWSTR path,const LPWSTR *fileMasks,DWORD fileMasksCount,DWORD flags,FINDFILEPROC findFileProc,void *data,HANDLE stopEvent,DWORD subfolderDelay,DWORD foundedDelay) { WCHAR curPath[MAX_PATH]; WIN32_FIND_DATAW wfd; HANDLE handle; if ((_PathCombine(curPath,path,L"*")) && ((handle=FindFirstFileW(curPath,&wfd)) != INVALID_HANDLE_VALUE)) { do { if ((stopEvent != NULL) && (WaitForSingleObject(stopEvent,0) != WAIT_TIMEOUT)) break; if (!IsDotsName(wfd.cFileName)) { if (((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (flags & FFFLAG_SEARCH_FOLDERS)) || ((!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) && (flags & FFFLAG_SEARCH_FILES))) { for (DWORD i=0; i < fileMasksCount; i++) { if (PathMatchSpecW(wfd.cFileName,fileMasks[i]) != FALSE) { if (!findFileProc(path,&wfd,data)) goto END; if (flags & FFFLAG_DELETE) { WCHAR filePath[MAX_PATH]; if (_PathCombine(filePath,path,wfd.cFileName)) { SetFileAttributesW(filePath,FILE_ATTRIBUTE_NORMAL); DeleteFileW(filePath); } } if (foundedDelay) Sleep(foundedDelay); break; } } } if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && flags & FFFLAG_RECURSIVE) { if (_PathCombine(curPath,path,wfd.cFileName)) { if (subfolderDelay) Sleep(subfolderDelay); FindFiles(curPath,fileMasks,fileMasksCount,flags,findFileProc,data,stopEvent,subfolderDelay,foundedDelay); } } } } while (FindNextFileW(handle,&wfd) != FALSE); END: FindClose(handle); } return; }
bool DirectoryExists(LPCWSTR asPath) { if (!asPath || !*asPath) return false; bool lbFound = false; HANDLE hFind = CreateFile(asPath, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hFind && hFind != INVALID_HANDLE_VALUE) { BY_HANDLE_FILE_INFORMATION fi = {0}; if (GetFileInformationByHandle(hFind, &fi) && (fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { lbFound = true; } CloseHandle(hFind); return lbFound; } // Try to use FindFirstFile? WIN32_FIND_DATAW fnd = {0}; hFind = FindFirstFile(asPath, &fnd); if (hFind == INVALID_HANDLE_VALUE) { return false; } do { if ((fnd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { // Each find returns "." and ".." items // We do not need them if (!IsDotsName(fnd.cFileName)) { lbFound = TRUE; break; } } } while (FindNextFile(hFind, &fnd)); FindClose(hFind); return (lbFound != FALSE); };
~CTempDir() { //MessageBox(NULL, L"~CTempDir()", gsTitle, MB_ICONINFORMATION); if (mb_RemoveDir && (gsTempFolder[0]) && (!IsDotsName(gsTempFolder)) ) { // non-empty directory will not be removed, // that is expected behavior BOOL b; if (ms_SelfPath[0]) b = SetCurrentDirectory(ms_SelfPath); b = RemoveDirectory(gsTempFolder); //if (!b) //{ // ReportError(99, L"RemoveDirectory(%s) failed", gsTempFolder); //} } };
bool Acquire() { if (gsTempFolder[0]) { if (IsDotsName(gsTempFolder)) return true; if (DirectoryExists(gsTempFolder)) return true; if (CreateDirectory(gsTempFolder, NULL)) { SetCurrentDirectory(gsTempFolder); mb_RemoveDir = true; // would be reset on success return true; } ReportError(exit_CreateDirectory, msgTempFolderFailed, gsTempFolder); if (gbExtractOnly || !gbAutoMode) return false; } else { // + "ConEmu160707" (CONEMUVERL) or "ConEmu160707_123456" (CONEMUVERL, hhmmss) DWORD cchMax = countof(gsTempFolder) - 20; //DWORD n = GetTempPath(cchMax, gsTempFolder); DWORD n = GetEnvironmentVariable(L"TEMP", gsTempFolder, cchMax); if (!n) n = GetTempPath(cchMax, gsTempFolder); if (n && (n < cchMax)) { wchar_t* pszSubDir = gsTempFolder+lstrlen(gsTempFolder); lstrcpy(pszSubDir, L"ConEmu"); pszSubDir += 6; lstrcpy(pszSubDir, CONEMUVERL); pszSubDir += lstrlen(pszSubDir); if (CreateDirectory(gsTempFolder, NULL)) { SetCurrentDirectory(gsTempFolder); mb_RemoveDir = true; return true; } SYSTEMTIME st = {}; GetLocalTime(&st); wsprintf(pszSubDir, L"_%02i%02i%02i", st.wHour, st.wMinute, st.wSecond); if (CreateDirectory(gsTempFolder, NULL)) { SetCurrentDirectory(gsTempFolder); mb_RemoveDir = true; return true; } } } ReportError(exit_CreateDirectory, msgTempFolderFailed, gsTempFolder); if (!gbAutoMode) return false; // Failed to get/create TEMP path? // Use our executable folder instead, set temp folder to L"." gsTempFolder[0] = L'.'; gsTempFolder[1] = 0; // And just change our current directory (it may be any folder ATM, e.g. system32) if (ms_SelfPath[0]) { if (SetCurrentDirectory(ms_SelfPath)) { DWORD n = GetCurrentDirectory(countof(gsTempFolder), gsTempFolder); if (!n || (n > countof(gsTempFolder))) { // Fail again? gsTempFolder[0] = L'.'; gsTempFolder[1] = 0; } } } // if the path is invalid - just do not change cd, // use current, set by user when they run our exe return true; };