예제 #1
0
 public void Add(string tag)
 {
     if (_hashSet.Add(tag))
     {
         _list.Add(tag);
     }
 }
예제 #2
0
        /// <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);
        }