コード例 #1
0
        /// <summary>
        /// Localizar os nomes de arquivos que conferem com o filtro indicado.
        /// </summary>
        /// <param name="pathFilter">
        /// Filtro para pesquisa de arquivos.
        ///
        /// São suportados os caracteres curinga:
        /// *, para indicar um trecho de nome, **, para indicar qualquer quantidade
        /// de pastas no caminho, e ?, para indicar um único caracter na posição.
        ///
        /// Por exemplo: O filtro "\Path\*.txt" retorna todos os arquivos TXT dentro da
        /// pasta "Path". O filtro "\Path\**\*.txt" retorna todos os arquivos TXT dentro
        /// da pasta "Path" ou em qualquer outra pasta na hierarquia de "Path".
        /// </param>
        /// <returns>
        /// O status da pesquisa mais os arquivos lidos.
        /// Em geral 200-OK com a lista dos arquivos lidos ou 404-NotFound com uma
        /// lista vazia caso nada seja encontrado.
        /// </returns>
        public Ret <string[]> FindResources(string pathFilter)
        {
            try
            {
                pathFilter = pathFilter.Replace(@"/", @"\");

                if (!pathFilter.StartsWith(@"\"))
                {
                    pathFilter = $@"\**\{pathFilter}";
                }

                var pattern = pathFilter
                              .Replace(@".", @"[.]")
                              .Replace(@"**", @"§")
                              .Replace(@"*", @"[^\]*")
                              .Replace(@"\§", @"(|\.*)")
                              .Replace(@"?", @".")
                              .Replace(@"\", @"\\")
                ;

                var regex = new Regex($"^{pattern}$", RegexOptions.IgnoreCase);

                var files = (
                    from path in ResourcePaths
                    where regex.IsMatch(path)
                    select path
                    ).ToArray();

                return(files.Length > 0 ? Ret.OK(files) : Ret.NotFound(files));
            }
            catch (Exception ex)
            {
                return(Ret.FailWithValue(ex, new string[0]));
            }
        }