Попытка открыть файл docx из файла bytestream - ошибка повреждения файла - PullRequest
2 голосов
/ 10 февраля 2010

мы постоянно получаем сообщение об ошибке поврежденного файла при открытии файла docx из сохраненного потока, даже если другие типы файлов работают нормально

Ниже приведен код из образца формы, который отражает проблему

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    'Objective is to be able to copy a file to a bytestream then create a new document from that stream  and then opne it.
    'This replicates the behaviour of our primary application where it stores and retrieves the stream from a database
    'With docx files we consistently experience some sort of corruption in the write of the original file
    'When selecting .doc or other format files we do not encounter the same problem

    'use selected file
    Dim _o1 As String = TextBox1.Text
    'get its bytestream
    Dim fs As New FileStream(_o1, FileMode.Open, FileAccess.Read)
    Dim byteStream(Convert.ToInt32(fs.Length)) As Byte
    fs.Read(byteStream, 0, Convert.ToInt32(fs.Length))

    'create a new file and use the bytestream to create it and save to disk
    Dim _o As String = "C:\" & Now.Ticks & getNewFileName()

    Dim fs1 As New FileStream(_o, FileMode.OpenOrCreate, FileAccess.Write)
    Using bw As New BinaryWriter(fs1)
        bw.Write(byteStream)
        bw.Flush()
    End Using

    'open the new document
    System.Diagnostics.Process.Start(_o)
    Application.DoEvents()
End Sub
Private Function getNewFileName() As String
    Dim fi As New FileInfo(TextBox1.Text)

    Return Now.Ticks.ToString & fi.Name
End Function
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    OpenFileDialog1.InitialDirectory = "c:\"
    OpenFileDialog1.FilterIndex = 2
    OpenFileDialog1.RestoreDirectory = True
    OpenFileDialog1.Filter = "docx files |*.docx"

    If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
        TextBox1.Text = OpenFileDialog1.FileName

    End If

End Sub

1 Ответ

1 голос
/ 12 февраля 2010

Простите, но это какой-то испорченный код.

Dim _o As String = "C:\" & Now.Ticks & getNewFileName()

станет ...

Dim _o As String = "C:\" & Now.Ticks & Now.Ticks.ToString & fi.Name

Пример результата "C: \" "634015010433498951" "634015010433498951" "FileName.txt", вероятно, не то, что вы ожидаете, если только вынамереваемся вычесть два числа тиков, чтобы определить, сколько времени потребовалось для заполнения FileInfo.

Повреждение FileStream может быть проблемой кодирования, отсутствием одной длины файла или даже длинного имени файла в глубоком пути.проблема.Вместо использования FileStream этот код должен работать нормально:

Dim sourceFile As String = TextBox1.text
Dim fi As New System.IO.FileInfo(sourceFile)
Dim destFile = "C:\" & Now.Ticks & fi.Name
fi.CopyTo(destFile)
'open the new document   
System.Diagnostics.Process.Start(destFile)
...