منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
[سؤال] * [تم الحل] * المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183)
+--- الموضوع : [سؤال] * [تم الحل] * المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق (/showthread.php?tid=42283)



* [تم الحل] * المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - سعود - 26-08-22

آخر تحديث هنا






المثال مرفق فقط للتقسيم عدل على مدخلاته لاني ثبتها للسرعة او للتجربة السريعة بصراحة نسيت احذفها
توجد مشكلة موضحة بالمشروع وهي بسيطة لكني لم اوفق الى الحل
اخر ملف يفترض بعده يتم تفعيل الزر  لا ادري كيف اشرح المشكلة 

======================================
الصورة التالية لخطا حذف آخر ملف مع اني استخدم غلق وتدمير  الرايتر والريدر والستريم كما هو موضح بالكود
طبعا عند غلق البرنامج يحذف ولا اقصد اني اريد الحذف لكني مستغرب انه لم ينتهي من العمل و هذا شي جنني بصراحة.


========================================




ساضع كلاس الفورم كامل هنا ان لم ترد تحميل المرفق:
PHP كود :
Imports System.IO
Public Class Form1
    Dim filemax 
As Long 0
    Dim mb 
As Long = (1024) ^ 2
    Dim filesize 
As Long 0
    Dim folder 
As String
    Dim th 
As Threading.Thread
    Private 
Function fl(ByVal fpath As String)
 
       If IO.File.Exists(fpath) = True Then
            Dim f 
As New IO.FileInfo(fpath)
 
           Return f.Length
        Else
            Return Nothing
        End 
If
 
   End Function
 
   Private Function folderfiles(ByVal fo As String) As Integer
        Dim dir 
As New IO.DirectoryInfo(fo)
 
       Return dir.GetFiles.Count
    End 
Function
 
   Private Sub split(ByVal fpath As String)
 
       If IO.File.Exists(fpath) = False Then Exit Sub
        Dim thefile 
As New IO.FileInfo(fpath)
 
       Dim fn As String thefile.Name
        Dim fs 
As New FileStream(fpathFileMode.Open)
 
       Dim br As New BinaryReader(fs)
 
       Dim i As Long 0
        Dim n 
As Long 0
        Dim mo 
As Long filesize Mod filemax
nxt
:
 
       Dim newfile As String folder fn "_File_" n.ToString("000000") & "_byte"
 
       p1.Invoke(Sub() p1.Maximum filemax + (filemax 80)) 'ماقدرت اتصرف معها زودت القيمة جدعنة بس
        For i = n To br.BaseStream.Length
            n = i
            Dim fw As New FileStream(newfile, FileMode.Append)
            Dim bw As New BinaryWriter(fw)
            bw.Write(br.ReadBytes(i))
            p1.Invoke(Sub() p1.Value = fl(newfile))
            fw.Close()
            fw.Dispose()
            bw.Close()
            bw.Dispose()
            If fl(newfile) >= filemax Then
                n += 1
                GoTo nxt
            End If
        Next ' 
الغريب ان الاكواد بعد هذا السطر لا يصل اليه البرنامج
        fs
.Close()
 
       fs.Dispose()
 
       br.Close()
 
       br.Dispose()
 
       lbl.Invoke(Sub() lbl.Text "تم")
 
       btnstart.Invoke(Sub() btnstart.Enabled True)
 
   End Sub
    Private Sub Form1_FormClosing
(sender As ObjectAs System.Windows.Forms.FormClosingEventArgsHandles Me.FormClosing
        If IsNothing
(th) = False Then
            If th
.IsAlive True Then
                th
.Abort()
 
           End If
 
       End If
 
   End Sub
    Private Sub Form1_Load
(sender As System.ObjectAs System.EventArgsHandles MyBase.Load
        rep
(Me)
 
   End Sub
    Private Sub Form1_MouseDown
(sender As System.ObjectAs System.Windows.Forms.MouseEventArgsHandles MyBase.MouseDownlbl.MouseDownLabel1.MouseDownp1.MouseDown
        If e
.Button Windows.Forms.MouseButtons.Left Then
            dr 
True
            ax 
MousePosition.Left
            ay 
MousePosition.Top
        End 
If
 
   End Sub
    Private Sub Form1_MouseMove
(sender As ObjectAs System.Windows.Forms.MouseEventArgsHandles Me.MouseMovelbl.MouseMoveLabel1.MouseMovep1.MouseMove
        If dr Then
            Left 
MousePosition.ax
            Top 
MousePosition.ay
        End 
If
 
   End Sub
    Private Sub Form1_MouseUp
(sender As ObjectAs System.Windows.Forms.MouseEventArgsHandles Me.MouseUplbl.MouseUpLabel1.MouseUpp1.MouseUp
        dr 
False
    End Sub
    Private Sub Label2_Click
(sender As System.ObjectAs System.EventArgsHandles Label2.Click
        Dim o 
As New OpenFileDialog
        If o
.ShowDialog Windows.Forms.DialogResult.OK Then
            txtsfile
.Text o.FileName
        End 
If
 
   End Sub
    Private Sub Label3_Click
(sender As System.ObjectAs System.EventArgsHandles Label3.Click
        Dim fbd 
As New FolderBrowserDialog
        If fbd
.ShowDialog Windows.Forms.DialogResult.OK Then
            txtfolder
.Text fbd.SelectedPath
            If txtfolder
.Text.Trim.ToLower.EndsWith("\") = False Then
                txtfolder.Text = txtfolder.Text & "
\"
            End If
        End If
    End Sub
    Private Sub btnstart_Click(sender As System.Object, e As System.EventArgs) Handles btnstart.Click
        If txtsfile.Text.Trim = "" Or txtfolder.Text.Trim = "" Or txtmax.Text.Trim = "" Then Exit Sub
        Dim fl As New IO.FileInfo(txtsfile.Text)
        folder = txtfolder.Text
        filesize = fl.Length
        filemax = CLng(txtmax.Text) * mb
        th = New Threading.Thread(AddressOf split)
        btnstart.Enabled = False
        If th.IsAlive = False Then
            th.Start(txtsfile.Text)
        End If
    End Sub
   
End Class 
ادري فيه لخبطة كثيرة لكن !Sad
شكرا لكم مقدما.



RE: المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - Taha Okla - 26-08-22

السلام عليكم ورحمة الله وبركاته 

وجدت مكان الخطأ وهو في الحلقة For
حتى يصل البرنامج لما بعد For يجب أن يصل العداد (i) لمدى الحلقة ثم عندها تنتهي الحلقة ويخرج تنفيذ الكود لما بعد الحلقة
يعني ركز مع الـ (i)  أو الرقم الذي يجب أن يصل له.

حتى في آخر مرحلة من تنفيذ الجزء الاخير تجد أن الـ (i) قيمتها صغيرة جداً مقارنة بمدى الحلقة ..
يعني كأنك تعيد تقييم قيمة الـ (i)  دون أن تعييد تقييم مدى الحلقة..

ركز هنا وسيتم الحل بإذن الله.


--


RE: المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - سعود - 26-08-22

لكن كيف اجعل الحلقة تنتهي بمجرد انتهاء الاجراء او كيف اتحكم بالموضوع.
الصراحة عقلي وقف.


RE: المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - Taha Okla - 26-08-22

اذا اشتغل معي عقلي واستطعت التركيز به 
سأنهيه بإذن الله..

ولكن حاليا  نحن في أخر الشهر وضغط العمل - وعلي انجاز الحسابات واغلاقها قبل نهاية الشهر ..


RE: المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - سعود - 26-08-22

(26-08-22, 09:29 PM)Taha Okla كتب : اذا اشتغل معي عقلي واستطعت التركيز به 
سأنهيه بإذن الله..

ولكن حاليا  نحن في أخر الشهر وضغط العمل - وعلي انجاز الحسابات واغلاقها قبل نهاية الشهر ..

الله يقويك 
انا قلت يمكن شيء قدام عيني ماني شايفه (وهذي عادة عندي ) اقصد اني اظن الخطا واضح.
الان البايت byte الواحد  اليس يساوي  رقم ضمن حلقة for ؟
for i=0 to 100 مثلا
اليس الرقم 100 يعني انه صار لدينا ملف بحجم 100 بايت؟
هذا اللذي اريد معرفته لانه لو كان مثل مااتصور لم تحدث المشكلة,,,,,  الملفات المستخرجة تعود بشكل ممتاز و لااشكال و لا خطا في دمجها.
على كل وفق الله الجميع لكل خير.


RE: المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - سعود - 27-08-22

آخر تحديث لاجراء split لكنه يجعل حجم آخر ملف اصغر من الحقيقي:
PHP كود :
Private Sub split(ByVal fpath As String)
 
       If IO.File.Exists(fpath) = False Then Exit Sub
        Dim thefile 
As New IO.FileInfo(fpath)
 
       Dim fn As String thefile.Name
        Dim fs 
As New FileStream(thefile.FullNameFileMode.Open)
 
       Dim br As New BinaryReader(fs)
 
       Dim i As Long 0
        Dim n 
As Long 0
        Dim rmain 
As Long = (br.BaseStream.Length filemax)
 
       Dim mo As Long br.BaseStream.Length Mod filemax
        Dim agroups 
As Long 0
        If mo 
0 Then
            agroups 
= (rmain 1)
 
       ElseIf mo 0 Then
            agroups 
rmain
        End 
If

nxt:
 
       Dim newfile As String folder fn "_File_" n.ToString("000000") & "_byte"
 
       p1.Invoke(Sub() p1.Maximum filemax + (filemax 80)) 'ماقدرت اتصرف معها زودت القيمة جدعنة بس
        For i = n To br.BaseStream.Length - 1
            n = i
            Dim fw As New FileStream(newfile, FileMode.Append)
            Dim bw As New BinaryWriter(fw)
            bw.Write(br.ReadBytes(i))
            ' 
lbl.Invoke(Sub() lbl.Text foldersize(folder))
 
           p1.Invoke(Sub() p1.Value fl(newfile))
 
           fw.Close()
 
           fw.Dispose()
 
           fw Nothing
            bw
.Close()
 
           bw.Dispose()
 
           bw Nothing
            If fl
(newfile) >= filemax Then
                
'  n += 1
                GoTo nxt
            End If
            ' 
If >= br.BaseStream.Length 1 Then GoTo g
            If folderfiles
(folder) = agroups Then
                GoTo g
            End 
If
 
       Next ' الغريب ان الاكواد بعد هذا السطر لا يصل اليه البرنامج
g:
        newfile = Nothing
        fs.Close()
        fs.Dispose()
        br.Close()
        br.Dispose()
        lbl.Invoke(Sub() lbl.Text = "تم")
        btnstart.Invoke(Sub() btnstart.Enabled = True)
    End Sub 


مثل ماقلت الخطا او الحل قدام عيني لكن مش شايفه
اللي كنت محتاجه هذا:

PHP كود :
br.BaseStream.Position br.BaseStream.Length 



RE: * [تم الحل] * المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - Taha Okla - 27-08-22

يؤسفني أقول لك لسا ما اكتمل المشروع
استعجلت الجواب

تأكد من أحجام الملفات التي يتم التقسيم لها (عدا الملف الاخير)
عندما تتطابق الاحجام تكون تقريباً وصلت لاهم شيء بالبرنامج..

ما دام هناك اختلاف يعني انه لا زال هناك عشوائية في تقسيم الملفات وليس تقسيم منظم.
وسينتج عن ذلك اخطاء نتيجة الاستخدام المتكرر - ربما هي غير ظاهرة الان - لكنها ستظهر ..


RE: * [تم الحل] * المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - سعود - 27-08-22

(27-08-22, 05:45 AM)Taha Okla كتب : يؤسفني أقول لك لسا ما اكتمل المشروع
استعجلت الجواب

تأكد من أحجام الملفات التي يتم التقسيم لها (عدا الملف الاخير)
عندما تتطابق الاحجام تكون تقريباً وصلت لاهم شيء بالبرنامج..

ما دام هناك اختلاف يعني انه لا زال هناك عشوائية في تقسيم الملفات وليس تقسيم منظم.
وسينتج عن ذلك اخطاء نتيجة الاستخدام المتكرر - ربما هي غير ظاهرة الان - لكنها ستظهر ..
الله المستعان,,,لعلها تتضح مع الوقت.
لكن الان الوضع ماشي.

فعلا لما غيرت الملف ظهرت المشاكل القديمة.
لكن عرفت اضبط الـ step او الـ value الخاص بالبروقرس بار.
و ان شالله تنحل.


RE: * [تم الحل] * المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق - سعود - 27-08-22

طبعا احتراما لهذا المثال اللذي اتعبنيSmile
حبيت احدثه مع انه ناقص لكن هذا افضل تحسين قدرت عليه وهو نفس فكرة  المثال الرئيسي لكن مثل ماقلت تنقصه كود الدمج وهو بسيط