Pergunta

Eu usei o setargv.obj ligação para Expansão Argumentos curinga no passado por uma série de aplicativos C e C ++, mas não consigo encontrar qualquer menção semelhante para aplicativos .NET.

Existe um padrão maneira de ter parâmetros de linha de comando do seu aplicativo automaticamente curinga ampliado? (ou seja, expandir .doc * de uma entrada no parâmetro args a tudo o que jogo que wildcard).

P.S. Eu tenho cortado algo em conjunto com Directory.GetFiles () para o meu projeto de pouca corrente, mas não cobre wildcards com caminhos (ainda), e que seria bom fazê-lo sem código personalizado.

Update: aqui é o meu corte áspero, para ilustração. Ele precisa dividir os parâmetros para a caminho e nome para o GetFiles, mas esta é a idéia geral. Ligando setargv.obj em um C ou C ++ app seria basicamente fazer tudo a expansão curinga, deixando o usuário apenas iterar sobre o array argv.


static void Main(string[] args)
{
    foreach (String argString in args)
    {
        // Split into path and wildcard
        int lastBackslashPos = argString.LastIndexOf('\\') + 1;
        path = argString.Substring(0, lastBackslashPos);
        filenameOnly = argString.Substring(lastBackslashPos, 
                                   argString.Length - lastBackslashPos);

        String[] fileList = System.IO.Directory.GetFiles(path, filenameOnly);
        foreach (String fileName in fileList)
        {
            //do things for each file
        }
    }
}
Foi útil?

Solução

Seus olhares código como exatamente como você deveria fazê-lo.

Outras dicas

Aqui nós minha corte áspero. Eu adoraria para que seja recursiva. E, tendo experimentado a falha do Windows curingas eu poderia decidir usar expressões regulares ao invés de deixar GetFiles () fazer isso por mim.

using System.IO;

public static string[] ExpandFilePaths(string[] args)
{
    var fileList = new List<string>();

    foreach (var arg in args)
    {
        var substitutedArg = System.Environment.ExpandEnvironmentVariables(arg);

        var dirPart = Path.GetDirectoryName(substitutedArg);
        if (dirPart.Length == 0)
            dirPart = ".";

        var filePart = Path.GetFileName(substitutedArg);

        foreach (var filepath in Directory.GetFiles(dirPart, filePart))
            fileList.Add(filepath);
    }

    return fileList.ToArray();
}

Eu não sei exatamente o que você está depois ... mas se eu chegar onde você está indo com os Directory.GetFiles () "hack" que você mencionou, em seguida, algo como este trabalho poder:

var Dirs = Directory.GetDirectories(@"C:\Windows", "sys*", 
SearchOption.TopDirectoryOnly).ToList();
var Files = new List<String>();
Dirs.ForEach(dirName => Files.AddRange(Directory.GetFiles(dirName, "*.sys", SearchOption.AllDirectories)));

A opção curinga na chamada GetDirectories permitirá que você pegar todos os diretórios contidos na pasta Windows [diretamente] que correspondem ao padrão "sys *".

Você pode então iterar sobre essas pastas agarrando todos os arquivos que correspondem ao padrão "* .sys".

É esse o tipo de coisa que você está procurando? Para expandir automaticamente os argumentos, você tem que extrair os wildcards em algum tipo de forma significativa e aplicá-las a esse modelo ...

Por exemplo:

RunMyApp "C: \ Windows \ Sys * \ * .sys"

Você iria puxar a corda C: \ Windows - provavelmente com uma expressão regular, encontrar o diretório de nível mais baixo que não contém um coringa, e aplicá-lo para o método GetDirectories, anexando a string curinga como parâmetro de busca.

Então, se o seu final de string (neste caso * .sys) como o padrão de pesquisa para Directory.GetFiles.

Se você queria ficar mais complicado e fazer algo como:

C:\Windows\*\Sys*\*.sys

Você usaria os SearchOptions para definir esse comportamento:

Directory.GetDirectories(@"C:\Windows", "sys*", SearchOptions.AllDirectories)

Este seria pegar todos os diretórios que combinava com os sys curinga * no diretório do Windows e todos os diretórios abaixo dela.

Se você queria se muito mais complicado do que isso, então eu não sei como você faria isso ... por exemplo, digamos que você queria pastas que estão contidas por pastas diretamente dentro do diretório Windows - Eu não tenho idéia como você iria sobre algo como que tenho medo ... Eu não imagino exportar toda a estrutura de árvore para XML e utilizando XPath para fazê-lo seria tão eficiente - o XPath seria incrivelmente simples para analisar usando wildcards - mas a conversão para XML não seria tão eficiente ...

ver o código fonte da classe Microsoft.Build.Shared.FileMatcher desmontado em Microsoft.Build.dll você pode ter uma idéia da implementação de GetFiles método.

como um cliente que você pode usar o método da seguinte maneira

var filelist = FileMatcher.GetFiles(@"c:\alaki",@"c:\alaki\**\bin\*.dll");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top