看起来我在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:
这意味着
我是否需要告诉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标记,因为它也是如何调用它并处理文件的另一个例子。
答案 0 :(得分:5)
您无需担心反斜杠。反斜杠不是VB中的特殊字符,就像在C#中一样。事实上,如果你把它们翻倍,你可能会遇到错误。
很难说出问题出在哪里。尝试缩小范围的一些想法:
尝试不重定向StandardInput,因为您没有传递任何内容。
从StandardError读取以确保它为空。它可能包含错误消息。
我会利用Debug.WriteLine来跟踪函数并尝试找出问题出现的地方。
这可能无关紧要,但我会在mystreamreader.ReadToEnd之后放置myProcess.WaitForExit。
Larry建议使用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
答案 1 :(得分:3)
这里有几点需要考虑。
首先,反斜杠字符是转义字符(即\ t \ n \ r \ n ...),并且应该双转义\\如果必须将其嵌入字符串中。
但是,.NET框架包含一个非常好的类:System.IO.Path,它有几个Combine方法重载,可以帮助您构建路径而不将反斜杠字符嵌入到字符串中。这也使您的代码在非Windows平台上运行它(在某种程度上不太可能)的事件中更具可移植性。
答案 2 :(得分: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。
答案 3 :(得分:1)
你应该只需要用另一个反斜杠来逃避每个反斜杠 或者,您可以在字符串前加上@符号(在C#中工作,不确定VB.NET)。
即。
而不是“C:\ this \ that.exe”
使用“C:\ this \ that.exe”
或@“C:\ this \ that.exe”