C# – modo più Semplice per analizzare file con spazi es. “C:\Test\File con spaces.txt”

Sto cercando di passare un percorso completo del file FFMPEG.

C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi

e ovviamente non gradire il fatto che il percorso dispone di spazi, mandare in errore, in questo modo:

C:\TestFolder\Input\Friends: no such file or directory

Così che cosa è il modo più semplice per utilizzare nomi di file con spazi? Devo solo sostituire tutti gli spazi bianchi con ~ caratteri o c’è un modo migliore? Ho cercato di fuggire la stringa con caratteri diversi:

@"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi";

Ma questo non funziona. C’è un trucco per preservare gli spazi?

  • “Utilizzare” in che modo? Qual è il problema con gli spazi ora?
  • Quale programma stai alimentazione file del film?
  • Aggiornato domanda – mi dispiace ragazzi

 

6 Replies
  1. 33

    L’unica volta che sarete in genere hanno a che fare qualsiasi speciale consegna con nomi che hanno spazi è quando sei di passaggio a strumenti esterni o formati. Se si sta costruendo un elenco di argomenti per un eseguibile esterno, per esempio, tutto quello che dovete fare è citare il percorso:

    string path = @"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi";
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = "program.exe";
    psi.Arguments = "\"" + path + "\""; //escape the quotes

    …che si tradurrà in questa riga di comando:

    program.exe
    “C:\TestFolder\Input\Friends Stagione
    6 – Gag Reel.avi”

    • Avvolgere il finale di un elenco di argomenti con “\”” + path + “\”” ha funzionato a meraviglia. Nooby domanda so 😛
    • Ha lavorato anche per me , grazie….
  2. 5

    stai usando FileInfo classe?

    contiene (quasi) tutto su un file, inclusi gli attributi e delle versioni dei file, non è necessario preoccuparsi di spazi o altri caratteri indesiderati. Fintanto che il file esiste, funziona bene su FileInfo.

    usarlo come

    FileInfo f = new FileInfo(fullPathEvenWithSpaces);

  3. 4

    In generale, i percorsi dei file passati come argomenti sulla riga di comando richiede il percorso per essere racchiusa tra virgolette.

    Se stai parlando di accettazione di percorsi di file come argomento per il vostro programma, è più facile per richiedere agli utenti di preventivo percorsi. In questo modo, il args argomento principale del metodo conterrà l’intero percorso come una singola stringa.

    Se stai chiamando altri programmi e argomenti di passaggio, di percorsi di file con spazi devono essere citato.

    Process p = new Process();
    p.StartInfo.FileName = "notepad.exe";
    p.StartInfo.Arguments = string.Format("\"{0}\"", filePath);
    p.Start();
  4. 4

    Sono d’accordo con il post precedente. Per rendere più facile, ecco il codice che si desidera utilizzare. A Mio modesto Parere, il solo nome del file è uno spazio libero file di nome.

    Al loro perseguimento, nel codice c# ho questo:

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern uint GetShortPathName(
       [MarshalAs(UnmanagedType.LPTStr)]
        string lpszLongPath,
       [MarshalAs(UnmanagedType.LPTStr)]
        StringBuilder lpszShortPath,
       uint cchBuffer);
    
    public static StringBuilder shortNameBuffer = new StringBuilder(256);
    public static string ToShortPathName(string longName)
    {
      uint result = GetShortPathName(longName, shortNameBuffer, 256);
      return shortNameBuffer.ToString();
    }

    Che aggiunge un metodo di classe che può essere utilizzato come questa:

    Stringa goodFileName = ToShortPathName(evilFileName);

    NOTA: sto usando questo, in un’interfaccia utente così non mi dispiace essere non thread-safe e il riutilizzo della StringBuider. Se siete in un ambiente multithread, assicurarsi di tirare la StringBuilder allocazione all’interno del vostro metodo.

Lascia un commento