Domanda

Ho usato il setargv.obj collegamento per espansione Argomenti jolly in passato per un certo numero di applicazioni C e C ++, ma non riesco a trovare alcuna menzione simile per applicazioni .NET.

C'è un standard modo per avere automaticamente i parametri della riga di comando del vostro app jolly ampliato? (cioè espandere * .doc da una voce nel parametro args a tutto ciò che match che jolly).

P.S. Ho messo insieme qualcosa con Directory.GetFiles () per il mio piccolo progetto in corso, ma non copre i caratteri jolly con percorsi (ancora), e sarebbe bello farlo senza codice personalizzato.

Aggiornamento: ecco il mio trucco di massima, per l'illustrazione. Ha bisogno di dividere i parametri per percorso e il nome per le GetFiles, ma questa è l'idea generale. Collegamento setargv.obj in un'applicazione C o C ++ sarebbe praticamente fare tutto l'espansione jolly, lasciando all'utente di scorrere soltanto sopra l'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
        }
    }
}
È stato utile?

Soluzione

Il tuo codice sembra esattamente come si suppone di farlo.

Altri suggerimenti

Qui ci mio mod di massima. Mi piacerebbe per essere ricorsivo. E dopo aver sperimentato la carenza di caratteri jolly di Windows potrei decidere di utilizzare le espressioni regolari, piuttosto che lasciare GetFiles () lo fa per me.

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();
}

Non sono sicuro esattamente quello che stai dopo ... ma se mi dove stai andando con i Directory.GetFiles () "hack" lei ha ricordato, poi qualcosa di simile potrebbe funzionare:

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)));

L'opzione jolly sulle GetDirectories chiamata vi permetterà di afferrare tutte le directory contenute nella cartella di Windows [direttamente] che corrispondono al modello "SYS *".

È quindi possibile iterare su tali cartelle afferrare tutti i file che corrispondono al modello "* .sys".

E 'questo il tipo di cosa che stai cercando? Per espandere automaticamente i args, che avrebbe dovuto estrarre i caratteri jolly in una sorta di modo significativo e applicarle a quel modello ...

Per esempio:

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

Si potrebbe tirare fuori la stringa C: \ Windows - probabilmente con un'espressione regolare, trovare la directory più basso livello che non contiene un jolly e applicarlo al metodo GetDirectories, allegando la stringa di caratteri jolly come il parametro di ricerca.

Quindi se il vostro fine della stringa (in questo caso * .sys) come modello di ricerca per Directory.GetFiles.

Se si voleva ottenere più complicato e fare qualcosa di simile:

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

Si potrebbe utilizzare i SearchOptions per impostare questo comportamento:

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

Ciò afferrare tutte le directory che corrispondono alla sys carattere jolly * nella directory di Windows e tutte le directory sotto di esso.

Se si voleva ottenere molto più complicato di così, allora io non sono sicuro di come l'hai fatto ... per esempio, dire che si voleva le cartelle che sono contenute in cartelle direttamente all'interno della directory di Windows - non ho idea come si dovrebbe fare per una cosa del genere che ho paura ... io non immagino esportare l'intera struttura ad albero per XML e utilizzando XPath per farlo sarebbe così efficiente - il XPath sarebbe favolosamente semplice per l'analisi fuori utilizzando i caratteri jolly - ma la conversione in XML non sarebbe così efficace ...

vedere il codice sorgente della classe Microsoft.Build.Shared.FileMatcher smontato in Microsoft.Build.dll è possibile ottenere qualche idea dall'attuazione del metodo GetFiles.

come client è possibile utilizzare il metodo come segue

var filelist = FileMatcher.GetFiles(@"c:\alaki",@"c:\alaki\**\bin\*.dll");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top