2010-02-10 81 views
2

我們始終從保存的字節流打開的docx文件時得到一個文件損壞的錯誤消息,埃夫裏,其它類型文件的工作方式確定試圖從一個字節流打開的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 
+0

不應該關閉fs1和fs嗎? – 2010-02-11 21:36:02

回答

1

原諒我,但那是一些亂七八糟的代碼。

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)