Como obter contagem de arquivos no diretório usando o comando exe in c # app

0

Eu quero usar a classe Process para executar um método command.exe para retornar o número de arquivos em um diretório pai.

Tem que estar usando o command.exe (várias razões).

Este é o meu código:

    private static Int64 GetFileCount(string path)
    {
        Int64 ct = 0;
        Process process = new Process();
        process.StartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe");
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.Arguments = "dir \"" + path + "\" /s/a-d | find /c \".dat\"";
        process.StartInfo.WorkingDirectory = path;
        process.Start();
        string output = process.StandardOutput.ReadToEnd();
        if (output != "")
        {
            ct = Convert.ToInt64(output);
        }
        process.WaitForExit();
        return ct;
    }

a variável do caminho é:

d:\Cloud\Catalogues
dir "d:\Cloud\Catalogues
    private static Int64 GetFileCount(string path)
    {
        Int64 ct = 0;
        Process process = new Process();
        process.StartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe");
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.Arguments = "dir \"" + path + "\" /s/a-d | find /c \".dat\"";
        process.StartInfo.WorkingDirectory = path;
        process.Start();
        string output = process.StandardOutput.ReadToEnd();
        if (output != "")
        {
            ct = Convert.ToInt64(output);
        }
        process.WaitForExit();
        return ct;
    }
15" /s/a-d | find /c ".dat"
15

Eu copiei isto e executei em um prompt do DOS e ele funciona OK, então eu sei que as coisas do DOS funcionam.

Isto é o que copiei e executei em um prompt do DOS / Command:

d:\Cloud\Catalogues
dir "d:\Cloud\Catalogues%pre%15" /s/a-d | find /c ".dat"
15

Eu usei outros comandos do DOS no meu aplicativo C # e tudo funciona bem.

O resultado é sempre uma string vazia {""}.

É apenas essa função "encontrar" com a qual estou tendo um problema.

Eu sei que posso usar um arquivo bat mas, para simplificar, prefiro usar o acima.

Estou sentindo falta de alguma coisa?

    
por Andrew Simpson 08.02.2015 / 12:26

1 resposta

1

Edit: O problema real parece ser que você está usando os argumentos errados. adicione '/ k' ou '/ c' quando quiser executar os comandos que você colocou na string Arguments.

Antigo, ainda pode ser relevante: Supondo que você tenha muito bom motivos para não usar o namespace System.IO para obter as informações que deseja como a maneira nativa não hacky, acho que é o fato de que você está tentando executar sem ShellExecute, o que significa que você tem que fornecer o caminho completo para o executável que você está tentando executar (neste caso o cmd.exe), pois o comando não é executado em um shell e, portanto, não possui variáveis de ambiente disponíveis para expandir a localização do cmd .Exe.

Dito isso, eu não testei isso, estou no Linux e geralmente desenvolvo no Mono. SuperUser não me deixou adicionar meus dois centavos sem uma resposta completa, porque eu não tenho reputação suficiente, mas ainda sinto que devo adicionar meus dois centavos.

    
por 08.02.2015 / 12:56

Tags