10

FFMPEG に完全なファイル パスを渡そうとしています。

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

そして、パスにスペースが含まれているという事実が明らかに気に入らず、次のようにエラーが発生します。

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

では、スペースを含むファイル名を使用する最も簡単な方法は何ですか? すべての空白を ~ 文字に置き換えるだけですか、それとももっと良い方法がありますか? さまざまな文字で文字列をエスケープしようとしました:

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

しかし、これはうまくいきません。スペースを維持するためのトリックはありますか?

4

6 に答える 6

34

通常、スペースを含むファイル名を特別に処理する必要があるのは、それらを外部ツールまたはフォーマットに渡すときだけです。たとえば、外部実行可能ファイルの引数リストを作成する場合は、パスを引用するだけです。

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

...これにより、次のコマンドラインが生成されます。

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

于 2009-12-07T01:52:29.737 に答える
8

System.IO。パスは、ファイル名を操作するためのいくつかの方法を提供します...

于 2009-12-07T01:44:36.113 に答える
5

FileInfoクラスを使用していますか?

属性やファイルのバージョンなど、ファイルに関する (ほぼ) すべての情報が含まれており、スペースやその他の不要な文字について心配する必要はありません。ファイルが存在する限り、FileInfo で問題なく動作します。

として使用します
FileInfo f = new FileInfo(fullPathEvenWithSpaces);

于 2009-12-07T02:10:42.023 に答える
5

一般に、コマンド ラインで引数として渡されるファイル パスでは、パスを引用符で囲む必要があります。

プログラムへの引数としてファイル パスを受け入れることについて話している場合は、ユーザーにパスを引用するように要求するのが最も簡単です。そうargsすれば、メイン メソッドへの引数には、パス全体が 1 つの文字列として含まれます。

他のプログラムを呼び出して引数を渡す場合、スペースを含むファイル パスは引用符で囲む必要があります。

Process p = new Process();
p.StartInfo.FileName = "notepad.exe";
p.StartInfo.Arguments = string.Format("\"{0}\"", filePath);
p.Start();
于 2009-12-07T01:56:33.083 に答える
4

上記の投稿に同意します。簡単にするために、使用する必要があるコードを次に示します。私の謙虚な意見では、唯一の適切なファイル名はスペースのないファイル名です。

したがって、C#コードでは次のようになります。

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

これにより、次のように使用できるメソッドがクラスに追加されます。

String goodFileName = ToShortPathName(evilFileName);

注: UI でこれを使用しているので、非スレッド セーフであり、StringBuider を再利用してもかまいません。マルチスレッド環境にいる場合は、必ずメソッド内で StringBuilder の割り当てをプルしてください。

于 2010-01-07T23:43:15.537 に答える
-2

すべてのファイルには、DOS 8.3 互換の短いパス名が付いています。そのファイル名を取得する唯一の方法は GetShortPathName です。私が見つけることができる最良の説明は、次のアドレスにあります。

http://www.pinvoke.net/default.aspx/kernel32.GetShortPathName

于 2009-12-07T02:25:54.847 に答える