台灣最大程式設計社群網站
線上人數
1350
 
會員總數:242767
討論主題:187734
歡迎您免費加入會員
討論區列表 >> VB.NET >> 大檔案的切割與合併
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
大檔案的切割與合併
價值 : 50 QP  點閱數:333 回應數:6

樓主

LuLu
門外漢
0 6
183 13
發送站內信

新人求問大檔案需要進行切割,但合併後檔案毀損不能使用,不要使用壓縮方法來切割,需要的是原始檔案進行切割,求高人指點

以下是我的程式碼:
切割


合併


搜尋相關Tags的文章: [ 檔案切割 ] , [ 檔案合併 ] ,
本篇文章發表於2018-01-07 19:12
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

練武功
檢舉此回應
我還沒看合併的程式碼,但切割的程式碼在第9行
fsout.Write(BinaryData, 0, BufferSizes)
照這個寫法,切割後的最後一個檔案的大小會多出許多0。因為你存入的長度固定為 BufferSizes,但最後一個檔案長度應該只有Datas。而 BufferSizes>=datas。
如果你的合併程式碼無誤,合併後的檔案長度會比原檔多出許多。
本篇文章回覆於2018-01-08 16:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

LuLu
檢舉此回應
是的,每一個檔案大小都一樣,是這邊導致合併出錯嗎?該怎麼解決
本篇文章回覆於2018-01-09 18:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

練武功
檢舉此回應
切割程式碼第9行改成 fsout.Write(BinaryData, 0, datas) '寫入讀入的長度。
分割後可以檢查分割後的檔案大小,其總和應該要等於原檔案的大小。

合併可改
Dim fs As FileStream
Dim Datas As Integer = 0
2: Dim BufferSizes As Integer = 1024 * 1024 * 0.5
3: Dim BinaryData(1) As Byte
4: Dim i As Integer = 1
5: Dim fsout As FileStream = File.OpenWrite("D:\test.mp4")
6: While File.Exists(fsout.Name + i.ToString())
7: fs = New FileStream((fsout.Name + i.ToString()), FileMode.Open)
ReDim BinaryData(fs.Length - 1)
8: Datas = fs.Read(BinaryData, 0, BinaryData.Count)
9: fsout.Write(BinaryData, 0, BinaryData.Count)
10:
14: fs.Close()
15: i += 1
16: End While
這個程式碼並未實際執行,你自己在試試看。

合併完,可檢查合併後檔案大小是否和原檔案一樣,與是否可使用,藉此考驗程式的正確性。

本篇文章回覆於2018-01-09 21:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

LuLu
檢舉此回應
可以,感謝高手幫忙,但這兩段程式碼最後都遇到一個問題,解決完就可以結帖了。
我發現除非我把程式關掉,否則檔案會在仍被使用的狀態,沒辦法直接使用,一開始我還以為失敗了。
FileStream已加入close(),怎麼會這樣該怎麼解決?
此功能必須要在後台持續執行,不能指望使用者主動關掉程式,否則這兩段程式碼根本不實用。
本篇文章回覆於2018-01-10 18:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

練武功
檢舉此回應
在程式的最後加上
.Dispose()
= Nothing
每個開啟的檔案都要使用。
至於=Nothing這行,或許可以不必使用,你再試試。

雖然你是初學者,但整個程式可以試著再優化,對你設計程式的功力會有所幫助。
本篇文章回覆於2018-01-10 21:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

LuLu
檢舉此回應
感謝練武功大大,結帖了
本篇文章回覆於2018-01-11 15:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.