2009-12-07 12 views
7

Ich versuche, einen vollständigen Dateipfad an FFMPEG zu übergeben.C# - Einfachste Möglichkeit zum Parsen von Dateinamen mit Leerzeichen z. "C: Test Datei mit Leerzeichen.txt"

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

und es ist offensichtlich die Tatsache nicht gefällt der Weg hat Räume darin, erroring wie so:

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

Also, was ist der einfachste Weg ist die Dateinamen mit Leerzeichen in ihnen zu benutzen? Sollte ich nur alle Leerzeichen durch ~ Zeichen ersetzen oder gibt es einen besseren Weg? Ich habe versucht, die Zeichenfolge mit verschiedenen Zeichen zu entkommen:

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

Aber das funktioniert nicht. Gibt es einen Trick, um Räume zu erhalten?

+1

"Verwendung" in welcher Weise? Was ist das Problem mit den Räumen jetzt? –

+0

In welches Programm füttern Sie die Filmdatei? – Woot4Moo

+0

Aktualisierte Frage - sorry guys –

Antwort

33

Die einzige Zeit, die Sie in der Regel besondere Behandlung mit Dateinamen mit Leerzeichen haben müssen, wenn Sie sie an externe Tools oder Formate übergeben. Wenn Sie eine Argumentliste für eine externe ausführbare Datei sind die Konstruktion, zum Beispiel, alles, was Sie tun müssen, ist, den Pfad zu zitieren:

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 

..., das in dieser Kommandozeile führen:

Programm .exe "C: \ Testfolder \ Input \ Friends - Season 6 - Gag Reel.avi"

+2

Wrapping der letzten Argumentliste mit "\" "+ Pfad +" "" hat ein Vergnügen gemacht. Nooby Frage Ich weiß: P –

+0

Arbeitete auch für mich, danke .... –

7

System.IO. Path bietet mehrere Methoden zum Bearbeiten von Dateinamen ...

+0

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

4

im allgemeinen Dateipfade als Argumente auf der Kommandozeile übergeben erfordern den Pfad mit Anführungszeichen umgeben werden.

Wenn Sie davon sprechen, Dateipfade als Argument für Ihr Programm zu akzeptieren, ist es am einfachsten, von Benutzern die Angabe von Pfaden zu verlangen. Auf diese Weise enthält das Argument args für Ihre Hauptmethode den gesamten Pfad als eine einzelne Zeichenfolge.

Wenn Sie andere Programme aufrufen und Argumente übergeben, müssen Dateipfade mit Leerzeichen in Anführungszeichen gesetzt werden.

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

verwenden Sie FileInfo Klasse?

Es enthält (fast) alles über eine Datei, einschließlich Attribute und Dateiversionen, und Sie müssen sich keine Gedanken über Leerzeichen oder andere unerwünschte Zeichen machen. Solange die Datei existiert, funktioniert sie gut in FileInfo.

Verwendung als
FileInfo f = new FileInfo(fullPathEvenWithSpaces);

4

ich mit der oben genannten Post zustimmen. Um es einfacher zu machen, hier ist der Code, den Sie verwenden müssen. In My Humble Opinion ist der einzige gute Dateiname ein Leerzeichen-freier Dateiname.

Dafür in C# -Code Ich habe dies:

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

, das eine Methode Ihrer Klasse fügt hinzu, die wie folgt verwendet werden kann:

String goodFileName = ToShortPathName (evilFileName);

HINWEIS: Ich verwende dies in einer Benutzeroberfläche, so dass es mir nichts ausmacht, nicht Thread-sicher und den StringBuider wiederverwenden. Wenn Sie sich in einer Umgebung mit mehreren Threads befinden, müssen Sie sicherstellen, dass die StringBuilder-Zuweisung innerhalb Ihrer Methode abgerufen wird.

Verwandte Themen