2

ASP.Net VB.Net のバックスラッシュは運が悪いようです。

ffprobe を使用してファイルに関する情報を出力しようとしていますが、バックスラッシュを含むすべての文字列のバックスラッシュでパスがランダムに切断されます。

この関数をデバッグして、fileToProcess によって生成されたパスを返します。

Function ffprobe_show_format(ByVal arg As String) As String
    Dim myProcess As New System.Diagnostics.Process()
    Dim fileToProcess As String = MapPath(".") & "\temps\" & arg
    myProcess.StartInfo.FileName = MapPath(".") & "\ffprobe.exe"
    myProcess.StartInfo.Arguments = "-show_format " & fileToProcess & " >C:\inetpub\vhosts\mysite.com\httpdocs\absolutefs\ffmpegtemp.txt"
    myProcess.StartInfo.UseShellExecute = False
    myProcess.StartInfo.RedirectStandardInput = True
    myProcess.StartInfo.RedirectStandardOutput = True
    myProcess.Start()
    Dim myStreamWriter As StreamWriter = myProcess.StandardInput
    Dim mystreamreader As StreamReader = myProcess.StandardOutput
    Dim str As String = mystreamreader.ReadToEnd
    Return str & ";" & "FileToProcess=" & fileToProcess & "MapPath(.) AND ffprobe.exe" & MapPath(".") & "\\ffprobe.exe"
End Function

そして、それは戻ります;FileToProcess=C:

だということだ

  • エラーが発生したため、ファイルが処理されません
  • My Path はバックスラッシュでカットされています
  • その後、文字列の残りの部分が壊れます

別の方法でバックスラッシュを表すように asp.net に指示する必要がありますか?

[編集]

答えを選択することはできませんが、2 つの間違いを犯したため、賛成票を投じます:いくつかの文字。

私は ASP.Net を初めて使用するので、適切なデバッグ方法を見つけるのが困難です。そのため、プラットフォームでデバッグできない場合は、最終的にいつものように作成しました。デバッグ変数をテキスト ファイルに書きました。

Function ffprobe_show_format(ByVal file As String, ByVal app As String) As String        
    Dim myProcess As New System.Diagnostics.Process()
    myProcess.StartInfo.FileName = app
    Dim argz As String = FormatCommandLine("-show_format", file)
    myProcess.StartInfo.Arguments = argz
    myProcess.StartInfo.UseShellExecute = False
    myProcess.StartInfo.RedirectStandardOutput = True
    myProcess.Start()
    Dim mystreamreader As StreamReader = myProcess.StandardOutput str As String = mystreamreader.ReadToEnd
    MapPath(".") & "/ffprobe.exe"
    Dim objWriter As New System.IO.StreamWriter(MapPath(".") & "\debug.txt")
    objWriter.Write(str)
    objWriter.Close()
    Return str
End Function

それを呼び出してファイルを処理する方法の別の例でもあるので、ffmpeg タグを追加します。

4

4 に答える 4

5

バックスラッシュについて心配する必要はありません。バックスラッシュは、C#のようにVBの特殊文字ではありません。実際、それらを2倍にすると、エラーが発生する可能性があります。

問題が発生している場所を特定するのは困難です。それを絞り込むためのいくつかのアイデア:

  • 何も渡していないので、StandardInputをリダイレクトしないようにしてください。

  • StandardErrorから読み取り、空であることを確認します。エラーメッセージが含まれている場合があります。

  • Debug.WriteLineを使用して関数をトレースし、問題が発生し始めた場所を特定しようとします。

  • これは問題ではないかもしれませんが、mystreamreader.ReadToEndの後にmyProcess.WaitForExitを配置します。

  • System.IO.Pathを使用するというLarryの提案は良いものです。

これらすべてに基づいて急いで変更されたコード:

Function ffprobe_show_format(ByVal arg As String) As String

    Debug.WriteLine("arg: " & arg)

    Dim fileToProcess As String = IO.Path.Combine(MapPath("."), "temps\" & arg)
    Debug.WriteLine("fileToProcess = " & fileToProcess)

    Debug.WriteLine("MapPath AND ffprobe.exe: " & IO.Path.Combine(MapPath(".") & "\\ffprobe.exe"))

    Dim myProcess As New System.Diagnostics.Process()
    myProcess.StartInfo.FileName = IO.Path.Combine(MapPath("."), "\ffprobe.exe")
    myProcess.StartInfo.Arguments = "-show_format " & fileToProcess & " >C:\inetpub\vhosts\mysite.com\httpdocs\absolutefs\ffmpegtemp.txt"
    myProcess.StartInfo.UseShellExecute = False
    'myProcess.StartInfo.RedirectStandardOutput = True
    myProcess.StartInfo.RedirectStandardError = True
    myProcess.Start()
    'Dim str As String = myProcess.StandardOutput.ReadToEnd
    Dim errStr as string = myProcess.StandardError.ReadToEnd
    myProcess.WaitForExit()

    Debug.WriteLine("myProcess exit code = " & myProcess.ExitCode.ToString())
    'Debug.WriteLine("stdOutput: " & str)
    Debug.WriteLine("stdError: " & errStr)

    Return str & ";" & "FileToProcess=" & fileToProcess

End Function
于 2012-06-18T18:18:08.207 に答える
3

ここで考慮すべき点がいくつかあります。

まず、バックスラッシュ文字はエスケープ文字 (つまり \t \n \r ...) であり、文字列に埋め込む必要がある場合は \\ を二重にエスケープする必要があります。

ただし、.NET フレームワークには非常に優れたクラス System.IO.Path が含まれています。このクラスには、バックスラッシュ文字を文字列に埋め込むことなくパスを構築するのに役立つ複数の Combine メソッド オーバーロードがあります。これにより、Windows 以外のプラットフォームでコードを実行する可能性がある (ややありそうもない) 場合でも、コードの移植性が向上します。

http://msdn.microsoft.com/en-us/library/system.io.path

于 2012-06-18T17:18:21.280 に答える
2

StreamReaderコンテンツにアクセスする前に を閉じてみてください:

Dim myStreamReader As StreamReader = myProcess.StandardOutput
Dim str As String = myStreamReader.ReadToEnd
myStreamReader.Close()
Return str & ";" & "FileToProcess=" & fileToProcess & "MapPath(.) AND ffprobe.exe" & MapPath(".") & "\\ffprobe.exe"

ローカルの devbox で関数を実行すると:

Function ffprobe_show_format(ByVal arg As String) As String
    Dim myProcess As New System.Diagnostics.Process()
    Dim fileToProcess As String = HttpContext.Current.Server.MapPath(".") & "\temps\" & arg
    myProcess.StartInfo.FileName = HttpContext.Current.Server.MapPath(".") & "\ffprobe.exe"
    myProcess.StartInfo.Arguments = "-show_format " & fileToProcess & " >C:\inetpub\vhosts\mysite.com\httpdocs\absolutefs\ffmpegtemp.txt"
    'myProcess.StartInfo.UseShellExecute = False
    'myProcess.StartInfo.RedirectStandardInput = True
    'myProcess.StartInfo.RedirectStandardOutput = True
    'myProcess.Start()
    'Dim myStreamWriter As StreamWriter = myProcess.StandardInput
    'Dim myStreamReader As StreamReader = myProcess.StandardOutput
    Dim str As String = String.Empty 'myStreamReader.ReadToEnd
    Return str & ";" & "FileToProcess=" & fileToProcess & "MapPath(.) AND ffprobe.exe" & HttpContext.Current.Server.MapPath(".") & "\\ffprobe.exe"
End Function

に対して返されるやや通常の文字列であると私が考えるものを取得しますffprobe_show_format

";FileToProcess=C:\Documents and Settings\Me\My Documents\Proj1\SubApp1\temps\testMapPath(.) AND ffprobe.exeC:\Documents and Settings\Me\My Documents\Proj1\SubApp1\\"

System.Diagnostics.Process()という実行可能ファイルがないため、 をコメントアウトしましたffprobe.exe

残りの部分が機能することを考えると、コンテンツにアクセスする前に StreamReader を閉じてみてください。

于 2012-06-18T18:42:57.060 に答える
1

各バックスラッシュを別のバックスラッシュでエスケープする必要があるだけです。
または、文字列の前に @ 記号を付けることもできます (C# では動作しますが、VB.NET についてはわかりません)。

IE では、"C:\this\that.exe" の代わりに "C:\
this\that.exe"
または @"C:\this\that.exe"を使用します。

于 2012-06-18T17:16:19.170 に答える