2012-06-18 185 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 
相关问题