2009-12-07 11 views
7

Sto cercando di passare un percorso file completo a FFMPEG.C# - Il modo più semplice per analizzare il nome del file con spazi es. "C: Test File with spaces.txt"

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

e non è, ovviamente, gradire il fatto che il percorso contiene spazi, erroring in questo modo:

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

Allora, qual è il modo più semplice per utilizzare nomi di file con spazi a loro? Dovrei semplicemente sostituire tutti gli spazi bianchi con caratteri ~ o c'è un modo migliore? Ho provato a sfuggire alla stringa con vari caratteri:

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

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

+1

"Usa" in che modo? Qual è il problema con gli spazi ora? –

+0

In quale programma si sta alimentando il file del film? – Woot4Moo

+0

Domanda aggiornata - scusate ragazzi –

risposta

33

L'unica volta che in genere devi eseguire una consegna speciale con nomi file con spazi è quando li passi a strumenti o formati esterni. Se si sta costruendo una lista 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:

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

+2

Disporre l'elenco degli argomenti finali con "\" "+ percorso +" \ "" ha funzionato a meraviglia. Nooby domanda lo so: P –

+0

ha funzionato anche per me, grazie .... –

7

System.IO. Path fornisce diversi metodi per manipolare i nomi dei file ...

+0

In particolare: http://msdn.microsoft.com/en-us/library/system.io.path.getfilename.aspx – Juliet

4

In generale, i percorsi dei file passate come argomenti sulla riga di comando richiedono il percorso per essere circondato con le virgolette.

Se si sta parlando di accettare percorsi di file come argomento per il proprio programma, è più semplice richiedere agli utenti di citare percorsi. In questo modo, l'argomento args per il metodo principale conterrà l'intero percorso come una singola stringa.

Se si stanno chiamando altri programmi e si passano argomenti, è necessario quotare i percorsi file con spazi.

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

stai usando FileInfo classe?

contiene (quasi) tutto su un file, inclusi gli attributi e le versioni dei file, e non devi preoccuparti di spazi o altri caratteri indesiderati. Finché il file esiste, funziona bene su FileInfo.

uso come
FileInfo f = new FileInfo(fullPathEvenWithSpaces);

4

Sono d'accordo con il post di cui sopra. Per semplificare, ecco il codice che devi usare. In My Humble Opinion, l'unico nome file valido è un nome file senza spazio.

Perciò in 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 per la classe che può essere utilizzato in questo modo:

String = goodFileName ToShortPathName (evilFileName);

NOTA: lo sto utilizzando in un'interfaccia utente, quindi non mi interessa essere sicuro da non thread e riutilizzare StringBuider. Se ti trovi in ​​un ambiente multi-thread, assicurati di estrarre l'allocazione StringBuilder all'interno del tuo metodo.

Problemi correlati