none
O que estou fazendo de errado neste código ? RRS feed

  • Pergunta

  • Caros amigos.

    O objetivo do código abaixo é capturar um arquivo que termina com "pro-rec.txt" e verificar se no seu conteúdo há algumas palavras específicas, neste caso estou testando uma delas. Consegui capturar o arquivo, mas na sequencia quero chamar um método que fará a verificação. O problema que está dando alguns erros de compilação. Poderiam me ajudar a depurar o código ?. Obrigado.


    using System.IO;

    namespace LerArquivodeRetornoUninfe
    {
        class Program
        {
            public string arquivo;

            void Main(string[] args)
            {

            string[] arquivos = Directory.GetFiles("C:\\SACTRM\\KM\\Retorno","*pro-rec.txt");

                foreach (var item in arquivos)
                {
    string arquivo = item;

                    PesquisaArquivo();
                }

            }

            public  void PesquisaArquivo()
            {
                String varPalavra = "Autorizado o uso da NF-e";

                StreamReader re = File.OpenText(arquivo);

                string input = re.ReadToEnd();

                if (input.IndexOf(varPalavra) > -1)
                    Console.WriteLine("Existe a palavra '" + varPalavra + "' no arquivo txt");
                else
                    Console.WriteLine("Não existe a palavra '" + varPalavra + "' no arquivo txt");

                re.Close();
            }
        }
    }

    sexta-feira, 28 de julho de 2017 02:36

Respostas

  • Na maior parte dos erros, apenas erros de iniciantes. Por exemplo, você declara o campo "arquivo", que é uma string. E tenta armazenar nele o retorno de Directory.GetFiles, que retorna uma string[] (array de strings). Segundo, ainda no método Main, você está tentando lidar com o campo "arquivos", que não é estático. Depois, ainda no método Main, no foreach você cria uma varável chamada "arquivo", que já existe, mas não faz nada com ela. Em seguida, tenta chamar o método "PesquisaArquivo", que também não é estático. Tente esse código:

    static void Main(string[] args)
    {
        string fileToSearch, directoryToSearch;
        string[] filesFound;
    
        GetInfo:
        Console.Write("Digite o nome do arquivo que deseja procurar: ");
        fileToSearch = Console.ReadLine();
        Console.Write("Digite o caminho da pasta em que deseja procurar o arquivo: ");
        directoryToSearch = Console.ReadLine();
    
        if (String.IsNullOrWhiteSpace(fileToSearch) || String.IsNullOrWhiteSpace(directoryToSearch))
        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Digite nomes validos para arquivo e pasta.\n");
            Console.ResetColor();
            goto GetInfo;
        }
    
        try
        {
            filesFound = Directory.GetFiles(directoryToSearch);
        }
        catch (Exception ex)
        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine($"Erro ao tentar buscar arquivos: {ex.Message}\n");
            Console.ResetColor();
            goto GetInfo;
        }
    
        if (filesFound.Length > 0 && filesFound != null)
            DisplayFoundFiles(filesFound);
        else
            Console.WriteLine("Nenhum arquivo encontrado.");
    
        Console.Write("\nPressione qualquer tecla para sair...");
        Console.ReadLine();
    }
    
    static void DisplayFoundFiles(string[] files)
    {
        string choice = "n";
    
        Console.Clear();
        Console.WriteLine("==== Arquivos encontrados ====\n");
    
        for (int i = 0; i < files.Length; i++)
        {
            Console.WriteLine($"{i +1} {Path.GetFileName(files[i])}");
        }
    
        Console.Write("\nDeseja escanear algum deles? [s/n]: ");
        choice = Console.ReadLine();
    
        if (choice == "S" || choice == "s")
            ChoooseFile(files);
    }
    
    static void ChoooseFile(string[] files)
    {
        int chosenFile = 0;
        GetInfo:
        Console.Write($"\nQual arquivo deseja escanear? [1-{files.Length}]: ");
    
        if (!int.TryParse(Console.ReadLine(), out chosenFile) || chosenFile < 0 || chosenFile > files.Length)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("\nOpção inválida!\n");
            Console.ResetColor();
            goto GetInfo;
        }
    
            ScanInFile(files[chosenFile -1]);
    }
    
    static void ScanInFile(string filePath)
    {
            string searchTerm;
            string fileContent;
            StreamReader sr;
            Console.Clear();
            Console.Write($"Digite a palavra ou frase que deseja procurar no arquivo {Path.GetFileName(filePath)}: ");
            searchTerm = Console.ReadLine();
    
            try
            {
                sr = new StreamReader(filePath);
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Clear();
                Console.Write($"ERRO: {ex.Message}");
                return;
            }
    
            fileContent = sr.ReadToEnd();
            sr.Close();
            Console.Clear();
    
            if (Regex.IsMatch(fileContent, searchTerm, RegexOptions.IgnoreCase))
                Console.Write($"O arquivo {Path.GetFileName(filePath)} contem o termo \"{searchTerm}\".\n");
            else
                Console.Write(($"O arquivo {Path.GetFileName(filePath)} NAO contem o termo \"{searchTerm}\".\n"));
    }

    No mais, veja essa referencia sobre a palavra chave static.

    • Marcado como Resposta GVGTEC sábado, 29 de julho de 2017 22:12
    sábado, 29 de julho de 2017 14:35

Todas as Respostas

  • Na maior parte dos erros, apenas erros de iniciantes. Por exemplo, você declara o campo "arquivo", que é uma string. E tenta armazenar nele o retorno de Directory.GetFiles, que retorna uma string[] (array de strings). Segundo, ainda no método Main, você está tentando lidar com o campo "arquivos", que não é estático. Depois, ainda no método Main, no foreach você cria uma varável chamada "arquivo", que já existe, mas não faz nada com ela. Em seguida, tenta chamar o método "PesquisaArquivo", que também não é estático. Tente esse código:

    static void Main(string[] args)
    {
        string fileToSearch, directoryToSearch;
        string[] filesFound;
    
        GetInfo:
        Console.Write("Digite o nome do arquivo que deseja procurar: ");
        fileToSearch = Console.ReadLine();
        Console.Write("Digite o caminho da pasta em que deseja procurar o arquivo: ");
        directoryToSearch = Console.ReadLine();
    
        if (String.IsNullOrWhiteSpace(fileToSearch) || String.IsNullOrWhiteSpace(directoryToSearch))
        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Digite nomes validos para arquivo e pasta.\n");
            Console.ResetColor();
            goto GetInfo;
        }
    
        try
        {
            filesFound = Directory.GetFiles(directoryToSearch);
        }
        catch (Exception ex)
        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine($"Erro ao tentar buscar arquivos: {ex.Message}\n");
            Console.ResetColor();
            goto GetInfo;
        }
    
        if (filesFound.Length > 0 && filesFound != null)
            DisplayFoundFiles(filesFound);
        else
            Console.WriteLine("Nenhum arquivo encontrado.");
    
        Console.Write("\nPressione qualquer tecla para sair...");
        Console.ReadLine();
    }
    
    static void DisplayFoundFiles(string[] files)
    {
        string choice = "n";
    
        Console.Clear();
        Console.WriteLine("==== Arquivos encontrados ====\n");
    
        for (int i = 0; i < files.Length; i++)
        {
            Console.WriteLine($"{i +1} {Path.GetFileName(files[i])}");
        }
    
        Console.Write("\nDeseja escanear algum deles? [s/n]: ");
        choice = Console.ReadLine();
    
        if (choice == "S" || choice == "s")
            ChoooseFile(files);
    }
    
    static void ChoooseFile(string[] files)
    {
        int chosenFile = 0;
        GetInfo:
        Console.Write($"\nQual arquivo deseja escanear? [1-{files.Length}]: ");
    
        if (!int.TryParse(Console.ReadLine(), out chosenFile) || chosenFile < 0 || chosenFile > files.Length)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("\nOpção inválida!\n");
            Console.ResetColor();
            goto GetInfo;
        }
    
            ScanInFile(files[chosenFile -1]);
    }
    
    static void ScanInFile(string filePath)
    {
            string searchTerm;
            string fileContent;
            StreamReader sr;
            Console.Clear();
            Console.Write($"Digite a palavra ou frase que deseja procurar no arquivo {Path.GetFileName(filePath)}: ");
            searchTerm = Console.ReadLine();
    
            try
            {
                sr = new StreamReader(filePath);
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Clear();
                Console.Write($"ERRO: {ex.Message}");
                return;
            }
    
            fileContent = sr.ReadToEnd();
            sr.Close();
            Console.Clear();
    
            if (Regex.IsMatch(fileContent, searchTerm, RegexOptions.IgnoreCase))
                Console.Write($"O arquivo {Path.GetFileName(filePath)} contem o termo \"{searchTerm}\".\n");
            else
                Console.Write(($"O arquivo {Path.GetFileName(filePath)} NAO contem o termo \"{searchTerm}\".\n"));
    }

    No mais, veja essa referencia sobre a palavra chave static.

    • Marcado como Resposta GVGTEC sábado, 29 de julho de 2017 22:12
    sábado, 29 de julho de 2017 14:35
  • Olá Cliffinho.

    Muito obrigado pela atenção. Realmente reconheço a falta de experiência para interpretar estes erros. Estou apostando em muito treino para chegar em um bom nível. Bem, quando vi sua resposta já havia conseguido resolver os erros no código. De qualquer forma, foi estudar o código que me enviou. E agora já tenho um novo desafio no mesmo código. Quando localizada a string desejada preciso isolar somente parte da string. Ex. Está é a string procurada "< xMotivo > Autorizado o uso da NF-e </ xMotivo >". Preciso isolar num outro campo somente está parte  "Autorizado o uso da NF-e". Sabe como fazer ?.  Obrigado.

    sábado, 29 de julho de 2017 16:47
  • Resolvido. Obrigado.
    sábado, 29 de julho de 2017 22:12
  • Me parece que você está lidando com arquivos XML certo? Bom, no seu caso, o namespace System.Xml pode resolver o seu problema. Veja um código simples:

    static void Main(string[] args)
    {
        string filePath, elementNameToSearch;
        bool elementFound = false;
        XmlReader xmlReader;
    
        Console.Write("Digite o caminho com o nome do arquivo a ser consultado: ");
        filePath = Console.ReadLine();
        Console.Write("Digite o elemento que deseja buscar: ");
        elementNameToSearch = Console.ReadLine();
        Console.Clear();
    
        try
        {
            xmlReader = XmlReader.Create(filePath);
        }
        catch (Exception ex)
        {
            Console.Write($"ERRO: {ex.Message}");
            goto End;
        }
    
        while (xmlReader.Read())
        {
            if (Regex.IsMatch(xmlReader.Name, elementNameToSearch, RegexOptions.IgnoreCase))
            {
                Console.Write($"Elemento encontrado!\n\n\t{xmlReader.Name}: {xmlReader.ReadString()}\n");
                elementFound = true;
                xmlReader.Close();
                break;
            }
        }
    
        if (!elementFound)
            Console.Write("Desculpe, elemento não encontrado.");
    
        End:
        Console.Write("\nPressione qualquer tecla para sair...");
        Console.ReadLine();
    }

    É claro, que eu presumo que teria uma maneira melhor de fazer isso, como procurar especificamente o elemento, ao invés de ler o arquivo todo. Mas vai resolver no seu caso :)

    • Editado Cliffinho segunda-feira, 31 de julho de 2017 12:47
    segunda-feira, 31 de julho de 2017 12:45