2012-02-17 1 views
0

Я пытаюсь сделать функцию распознавания голоса голосом Google api.Файл постоянно используется моим кодом и не может быть удален вручную или кодом

Я модифицировал функцию UPLOADFILEEX, которую можно найти на CodeProject ...

Файл Я хочу удалить это C: \ record.flac

Вот функция ниже

  Public Shared Function UploadFile(ByVal uploadfilename As String, ByVal url As String, ByVal fileFormName As String, ByVal contenttype As String, ByVal querystring As System.Collections.Specialized.NameValueCollection, ByVal cookies As CookieContainer) As String 
    If (fileFormName Is Nothing) OrElse (fileFormName.Length = 0) Then 
     fileFormName = "file" 
    End If 
    If (contenttype Is Nothing) OrElse (contenttype.Length = 0) Then 
     contenttype = "application/octet-stream" 
    End If 
    Dim postdata As String 
    postdata = "?" 
    If Not (querystring Is Nothing) Then 
     For Each key As String In querystring.Keys 
      postdata += key + "=" + querystring.Get(key) + "&" 
     Next 
    End If 
    Dim uri As Uri = New Uri(url + postdata) 
    Dim boundary As String = "----------" + DateTime.Now.Ticks.ToString("x") 
    Dim webrequest As HttpWebRequest = CType(Net.WebRequest.Create(uri), HttpWebRequest) 
    webrequest.CookieContainer = cookies 
    webrequest.ContentType = "audio/x-flac; rate=16000" 
    webrequest.Method = "POST" 
    Dim sb As StringBuilder = New StringBuilder 
    sb.Append("--") 
    sb.Append(boundary) 
    sb.Append("" & Microsoft.VisualBasic.Chr(13) & "" & Microsoft.VisualBasic.Chr(10) & "") 
    sb.Append("Content-Disposition: form-data; name=""") 
    sb.Append(fileFormName) 
    sb.Append("""; filename=""") 
    sb.Append(IO.Path.GetFileName(uploadfilename)) 
    sb.Append("""") 
    sb.Append("" & Microsoft.VisualBasic.Chr(13) & "" & Microsoft.VisualBasic.Chr(10) & "") 
    sb.Append("Content-Type: ") 
    sb.Append(contenttype) 
    sb.Append("" & Microsoft.VisualBasic.Chr(13) & "" & Microsoft.VisualBasic.Chr(10) & "") 
    sb.Append("" & Microsoft.VisualBasic.Chr(13) & "" & Microsoft.VisualBasic.Chr(10) & "") 
    Dim postHeader As String = sb.ToString 
    Dim postHeaderBytes As Byte() = Encoding.UTF8.GetBytes(postHeader) 
    Dim boundaryBytes As Byte() = Encoding.ASCII.GetBytes("" & Microsoft.VisualBasic.Chr(13) & "" & Microsoft.VisualBasic.Chr(10) & "--" + boundary + "" & Microsoft.VisualBasic.Chr(13) & "" & Microsoft.VisualBasic.Chr(10) & "") 
    Dim fileStreama As FileStream = New FileStream(uploadfilename, FileMode.Open, FileAccess.Read) 
    Dim length As Long = postHeaderBytes.Length + fileStreama.Length + boundaryBytes.Length 
    webrequest.ContentLength = length 
    Dim requestStream As Stream = webrequest.GetRequestStream 
    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length) 
    Dim sendBuffer(Math.Min(4096, fileStreama.Length)) As Byte 
    Dim bytesRead As Integer = 0 
    Do 
     bytesRead = fileStreama.Read(sendBuffer, 0, sendBuffer.Length) 
     If bytesRead = 0 Then Exit Do 
     requestStream.Write(sendBuffer, 0, bytesRead) 
    Loop 
    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length) 
    Dim responce As WebResponse = webrequest.GetResponse 
    Dim s As Stream = responce.GetResponseStream 
    Dim sr As StreamReader = New StreamReader(s) 
    Return sr.ReadToEnd 
    sr.Dispose() 
    s.Dispose() 
    fileStreama.Dispose() 
    requestStream.Dispose() 
    webrequest.Abort() 
    responce.Close() 

End Function 

Функция WORKS (Thankgod), но всякий раз, когда я хочу очистить (т. Е. Удалить аудиофайл, который находится в c :), он просто зависает и ничего не происходит ...

Вот мой код, который выполняется на событие FormClosing ....

 Private Sub Form1_Close(sender As System.Object, e As System.EventArgs) Handles MyBase.FormClosing 
    Dim di As New IO.DirectoryInfo("c:\") 
    Dim diar1 As IO.FileInfo() = di.GetFiles() 
    Dim dra As IO.FileInfo 
    For Each dra In diar1 
     If dra.Name.Contains("record.") Then 
      dra.Delete() 
     End If 
    Next 
End Sub 

Как вы, вероятно, может быть в состоянии видеть из функции Я попытался удалить все ПОТОКИ И БЛИЗКИЕ К НИМ ФАЙЛА НЕ БЫТИЯ ACCESSED

Но он все еще зависает, и когда я пытаюсь вручную удалить его ... он говорит мне, что он используется другим процессом (который является моей программой) - (я использую ffmpeg для преобразования .wav в .flac-файл, но что не вызывает никаких проблем) ....

Что я делаю неправильно ...

Я пропустил закрытие какого-то потока или что-то в этом роде.

Кстати uploadfilename струнной C: \ record.flac (только для информации - я не думаю, что это поможет)

ответ

0

Ваша функция вызывает Return перед удалением потока файла. Это означает, что ваш вызов Dispose никогда не запускается .. и поток содержит ссылку на файл.

+0

Спасибо, сработало! Не могу поверить, что раньше не думал об этом! –

+0

@ImranAhmed - Я удивлен, что вы не получили предупреждение компилятора о недостижимом коде! Является ли вариант строгим? –

0

Я согласен с Boo, что причиной этого является возвращение до распоряжения. Таким образом, решение было бы сохранить результат sr.ReadToEnd в переменной, закрыть потоки и затем вернуть var.

Но лучшим решением было бы использовать оператор Using (http://msdn.microsoft.com/en-us/library/htd05whh.aspx) для каждого класса, который вы должны вызвать .Dispose() on (aka классы, которые реализуют IDisposable).

Это дает более четкий код, потому что вы можете легко увидеть, какие ресурсы используются в вашем коде. Также менее баггированный код, как .NET, гарантирует, что все будет удалено, как только вы покинете область использования блока.

+0

Еще раз спасибо за комментарий (Как ответить на этот вопрос как «ответил»?) –

+0

Я думаю, что рядом с каждым ответом, который вы можете щелкнуть, должна быть большая галочка. – SpoBo