2012-06-18 144 views
2

在ASP.Net VB.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:

這意味着

  • 我的文件是不是因爲一些錯誤的處理
  • 我的路徑是反斜槓
  • 然後打破字符串的其餘部分

是否需要告訴asp.net以另一種方式表示反斜槓?

[編輯]

我不能選擇一個答案,但會給予好評,因爲我犯了兩個錯誤: - 要調試,我讀我的價值,一旦它被放在SQL變量與限制一個大小,然後 - ...使用Newtonsoft.Json解析器獲取,可能會拒絕某些字符。

我是新上的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標記,因爲這也是如何調用它並處理文件的另一個示例。

回答

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。

1

你應該只需要逃避與另一個反斜槓反斜槓每一個。
或者,您可能可以用@符號(在C#中工作,不確定VB.NET)爲字符串加前綴。

I.E. 而不是 「C:\本\ that.exe」
使用 「C:\本\ that.exe」
或@ 「C:\本\ that.exe」

+2

VB字符串不需要與C#字符串相同的轉義。通常你只需要擔心雙引號,並且你只需在VB中加倍「」就可以轉義。 – mgnoonan

+0

無法在VB.Net中工作 –

3

有幾件事情在這裏考慮。

首先,反斜槓字符轉義字符(即\ t \ n \ r ...),應該是雙重逸出\\如果您必須嵌入到字符串。

但是,.NET框架包含一個非常好的類:System.IO.Path有幾個結合方法重載,可以幫助您構建路徑不嵌入反斜槓字符轉換成字符串。這也使得你的代碼在一些非常不可能的事件中更具可移植性,你可以在非Windows平臺上運行它。

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

+2

反斜槓是C#中的轉義字符,而不是VB。 –

4

您不必擔心反斜槓。 VB中的反斜槓並不是特殊字符,就像它在C#中一樣。事實上,如果你把它們加倍,你可能會遇到錯誤。

很難說出問題的發生地點。一些想法試圖縮小它:

  • 嘗試不重定向StandardInput,因爲你沒有傳遞任何東西。

  • 從StandardError中讀取以確保它爲空。它可能包含錯誤消息。

  • 我會利用Debug.WriteLine跟蹤函數,並嘗試找出事情開始出錯的地方。

  • 這可能沒關係,但是我會在mystreamreader.ReadToEnd之後放置myProcess.WaitForExit。

  • 拉里建議使用System.IO.Path是一個很好的建議。

在此基礎上都有些倉促修改後的代碼:

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 
相關問題