none
Dúvida para mostrar data e hora de criação de arquivos RRS feed

  • Pergunta

  • Olá pessoal, na rotina abaixo, quero que mostre a data e hora de criação de todos os arquivos executáveis da pasta ESTOQUE, que comecem com com as letras LOJA, seria LOJA01.EXE, LOJA02.EXE, mas nessa linha  System.IO.FileInfo file_info = new System.IO.FileInfo("C:\\LOJA**"); está dando erro de compilação, o que há de errado nesse comando ?

    System.IO.DriveInfo di = new System.IO.DriveInfo(@"C:\ESTOQUE");

    System.IO.DirectoryInfo dirInfo = di.RootDirectory;

    System.IO.FileInfo[] fileNames = dirInfo.GetFiles("*.EXE");

                foreach (System.IO.FileInfo fi in fileNames)
                {
        

                    System.IO.FileInfo file_info = new System.IO.FileInfo("C:\\LOJA**");

                    string Criado = file_info.CreationTime.ToString("dd/MM/yyyy HH:mm:ss");
                    string Modificado = file_info.LastWriteTime.ToString("dd/MM/yyyy HH:mm:ss");
                    string Acessado = file_info.LastAccessTime.ToString("dd/MM/yyyy HH:mm:ss");

                    Console.WriteLine("Criado " + Criado);

              } 

    Consele Application, Windows 7, C#

    Obrigado.

    segunda-feira, 31 de julho de 2017 22:12

Respostas

  • Pois é o que o código que te passei faz. Ele analisa a data e hora do executável e te devolve uma lista ordenada, onde o primeiro elemento é o mais antigo, e o último é o mais atual.
    • Marcado como Resposta Porter Porter quinta-feira, 3 de agosto de 2017 12:38
    terça-feira, 1 de agosto de 2017 17:04

Todas as Respostas

  • Sinceramente, não sei o porque de toda essa rotina, me parece só um monte de código desnecessário empilhado. Digo isso porque, você cria um array de FileInfo, que deveria pegar todos os arquivos de uma certa pasta, com a extenssão ".exe". Mas você não usa eles pra nada, pelo contrário, no foreach você cria um novo FileInfo, passando agora uma pasta diretamente, sem usar aqueles DirectoryInfo e DriveInfo pra nada. E outra, ainda nesse foreach, quando você tenta criar um novo FileInfo, você passa a string "C:\\LOJA**". Pra que os dois asteriscos? Se você apenas tem que passar o caminho até o arquivo, e não um Search Pattern. Bom, não sei exatamente o que você está tentando fazer, só sei que a parte de pegar a data de criação de arquivos é bem fácil. Veja se esse código resolve seu problema:

    static void Main(string[] args)
    {
        string directoryPath, searchPattern;
        string[] filesFound;
    
        Console.Write("Digite o caminho com o nome da pasta que deseja escanear: ");
        directoryPath = Console.ReadLine();
        Console.Write("Digite o padrao de pesquisa (nome de arquivo ou extenssao): ");
        searchPattern = Console.ReadLine();
        Console.Clear();
    
        try
        {
            filesFound = Directory.GetFiles(directoryPath, searchPattern, SearchOption.TopDirectoryOnly);
        }
        catch (Exception ex)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write($"ERRO: {ex.Message}");
            Console.ResetColor();
            goto End;
        }
    
        if (filesFound.Length == 0)
        {
            Console.WriteLine("Desculpe, nenhum arquivo encontrado.");
            goto End;
        }
    
        Console.WriteLine("==== RESULTADO DA PESQUISA ====\n");
    
        foreach (string filePath in filesFound)
        {
            FileInfo fInfo = new FileInfo(filePath);
            Console.WriteLine($"Arquivo: {Path.GetFileName(fInfo.Name)},\nCriado em: {fInfo.CreationTime.ToString()}\n");
        }
    
        End:
        Console.Write("\nPressione qualquer tecla pra continuar...");
        Console.ReadLine();
    }

    Só por ajuda mesmo, você também pode conferir os Padrões de Formatação de Data e Hora do .NET Framework.

    Veja se isso te ajuda.

    terça-feira, 1 de agosto de 2017 14:21
  • olá Cliffinho,

    A intenção é criar uma rotina para verificar em uma determinada pasta, qual executável é o mais recente e executá-lo.

    Obrigado pela atenção.

    terça-feira, 1 de agosto de 2017 16:25
  • Pois é o que o código que te passei faz. Ele analisa a data e hora do executável e te devolve uma lista ordenada, onde o primeiro elemento é o mais antigo, e o último é o mais atual.
    • Marcado como Resposta Porter Porter quinta-feira, 3 de agosto de 2017 12:38
    terça-feira, 1 de agosto de 2017 17:04
  • using System.Linq;

    #region pega o primeiro arquivo pela data de geração int indAux = -1; // Obtem todos os arquivo da pasta List<string> lstArquivos = this.ArquivosPasta(emp, vPasta, "XXX*.txt"); if (lstArquivos.Count > 1) { indAux = oAux.PegaArquivoMaisAntigoPorData("XXX", "*.txt", vPasta, lstArquivos, emp, indAux); } else { indAux = 0; } int i = indAux; if (indAux == -1) return; #endregion pega o primeiro arquivo pela data de geração #region Pegar arquivo mais antigo da pasta(folder) public int PegaArquivoMaisAntigoPorData(string iniciaisArq, string finalArquivo, string vPasta, List<string> lstArquivos, int emp, int i) { return PegaArquivoMaisAntigoPorData(iniciaisArq, finalArquivo, vPasta, lstArquivos, emp, i, true); } /// <summary> /// Pega os arquivos pela ordem de geração, do mais antigo para o mais novo; /// </summary> /// <param name="iniciaisArq">Iniciais do arquivo a ser prourado</param> /// <param name="finalArquivo">final do arquivo a ser procurado</param> /// <param name="vPasta">a pasta dos arquivos</param> /// <param name="lstArquivos">lista de todos os arquivos que atendem o filtro de pesquisa pela inicial e finalarquivo</param> /// <param name="emp">empresa processada</param> /// <param name="i">indice auxiliar</param> /// <returns>Indice auxiliar encontrado</returns> public int PegaArquivoMaisAntigoPorData(string iniciaisArq, string finalArquivo, string vPasta, List<string> lstArquivos, int emp, int i, bool porCnpj) { try { System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(vPasta); FileInfo[] files = dir.GetFiles(iniciaisArq + ((porCnpj ? Empresa.Configuracoes[emp].CNPJ : string.Empty)) + "*" + finalArquivo).OrderBy(p => p.CreationTime).ToArray(); bool finalizado = false; //// vai pegar o arquivo com data menor foreach (FileInfo file in files) { for (int ix = 0; ix < lstArquivos.Count; ix++) { if (lstArquivos[ix] == file.FullName) { i = ix; finalizado = true; break; } } if (finalizado) break; } } catch { i = 0; } if (i == -1) i = 0; return i; } #endregion Pegar arquivo mais antigo da pasta(folder)

    Espero que te ajude.
    • Editado Jose Geraldo terça-feira, 1 de agosto de 2017 17:13 correção using
    terça-feira, 1 de agosto de 2017 17:10
  • ola Cliffinho,

    A rotina que você passou, mostra os arquivos, mas não está considerando a hora, para que fiquem em ordem, seria assim:

    DIR *.EXE /OD

    LOJA.EXE        01/08/17     10:00

    LOJA01.EXE    01/08/17     10:10

    LOJA02.EXE    01/08/17     11:00

    Não conheço qual comando usar para coloca-los em ordem de data e hora, tentei algumas linhas de código, mas não está dando certo.

    Obrigado.

    terça-feira, 1 de agosto de 2017 20:37
  • Você não disse que queria ordenar eles por um certo critério, por isso o código que te passei só faz é mostrar o nome com data e hora de criação. Veja o teste que fiz:

    Agora, se você quer ordenar eles pela data de criação, use esse código:

    static void Main(string[] args)
    {
        DirectoryInfo dirInfo = new DirectoryInfo(Environment.CurrentDirectory);
        FileInfo[] files = dirInfo.GetFiles("*.exe", SearchOption.TopDirectoryOnly);
        IOrderedEnumerable<FileInfo> mostRecent = files.OrderBy(x => x.CreationTime);
        int i = 0;
    
        Console.WriteLine("==== RESULTADO DA PESQUISA ====\n");
    
        foreach (FileInfo file in mostRecent)
        {
            Console.WriteLine($"{i + 1} - {file.Name}, {file.CreationTime}");
            i++;
        }
    
        Console.Write("\nPressione qualquer tecla para continuar...");
        Console.ReadLine();
    }

    Obs.: Esse código usa a pasta em que o executável está. A ordem é do mais antigo, para o mais recente. Resultado:



    • Editado Cliffinho quarta-feira, 2 de agosto de 2017 13:48
    quarta-feira, 2 de agosto de 2017 13:46
  • Comigo, essa linha está dando erro de compilação, aparentemente está tudo certo.

    Console.WriteLine( $"{i + 1} - {file.Name}, {file.CreationTime}" );

    quarta-feira, 2 de agosto de 2017 17:25
  • Agora compilou, no lugar de $ é @.

    Console.WriteLine(@"{i + 1} - {file.Name}, {file.CreationTime}" );

    quarta-feira, 2 de agosto de 2017 19:31