public void Add(string tag) { if (_hashSet.Add(tag)) { _list.Add(tag); } }
/// <summary> /// Helper for finding language-named subdirectories in an installed FM directory. /// </summary> /// <param name="supportedHash"></param> /// <param name="path"></param> /// <param name="searchList"></param> /// <param name="retList"></param> /// <param name="earlyOutOnEnglish"></param> /// <returns><see langword="true"/> if English was found and we quit the search early</returns> internal static bool SearchDirForLanguages( HashSetI supportedHash, string path, List <string> searchList, HashSetI retList, bool earlyOutOnEnglish) { path = NormalizeAndCheckPath(path, pathIsKnownValid: true); using var findHandle = FindFirstFileExW(@"\\?\" + path + "\\*", FINDEX_INFO_LEVELS.FindExInfoBasic, out WIN32_FIND_DATAW findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FIND_FIRST_EX_LARGE_FETCH); if (findHandle.IsInvalid) { int err = Marshal.GetLastWin32Error(); if (err is ERROR_FILE_NOT_FOUND or ERROR_NO_MORE_FILES) { return(false); } ThrowException("*", err, path); } do { if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY && // Just ignore reparse points and sidestep any problems (findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != FILE_ATTRIBUTE_REPARSE_POINT && findData.cFileName != "." && findData.cFileName != "..") { if (supportedHash.Contains(findData.cFileName)) { // Add lang dir to found langs list, but not to search list - don't search within lang // dirs (matching FMSel behavior) retList.Add(findData.cFileName); // Matching FMSel behavior: early-out on English if (earlyOutOnEnglish && findData.cFileName.EqualsI("english")) { return(true); } } else { searchList.Add(Path.Combine(path, findData.cFileName)); } } } while (FindNextFileW(findHandle, out findData)); return(false); }