تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[سؤال] * [تم الحل] * المحاولة الثانية و اللتي باءت بالفشل حول تقسيم ملف بشكل دقيق
#1
آخر تحديث هنا






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

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


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




ساضع كلاس الفورم كامل هنا ان لم ترد تحميل المرفق:
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
شكرا لكم مقدما.


الملفات المرفقة
.zip   NewSplitterAndMerger.zip (الحجم : 16.34 ك ب / التحميلات : 7)
اللهم إني أعوذ بك من غلبة الدين وغلبة العدو، اللهم إني أعوذ بك من جهد البلاء ومن درك الشقاء ومن سوء القضاء ومن شماتة الأعداء
اللهم اغفر لي خطيئتي وجهلي، وإسرافي في أمري وما أنت أعلم به مني، اللهم اغفر لي ما قدمت وما أخرت، وما أسررت وما أعلنت وما أنت أعلم به مني، أنت المقدم وأنت المؤخر وأنت على كل شيء قدير
}}}
#2
السلام عليكم ورحمة الله وبركاته 

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

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

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


--
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
}}}
#3
لكن كيف اجعل الحلقة تنتهي بمجرد انتهاء الاجراء او كيف اتحكم بالموضوع.
الصراحة عقلي وقف.
اللهم إني أعوذ بك من غلبة الدين وغلبة العدو، اللهم إني أعوذ بك من جهد البلاء ومن درك الشقاء ومن سوء القضاء ومن شماتة الأعداء
اللهم اغفر لي خطيئتي وجهلي، وإسرافي في أمري وما أنت أعلم به مني، اللهم اغفر لي ما قدمت وما أخرت، وما أسررت وما أعلنت وما أنت أعلم به مني، أنت المقدم وأنت المؤخر وأنت على كل شيء قدير
}}}
تم الشكر بواسطة: جيولوجي مبتدئ , جيولوجي مبتدئ
#4
اذا اشتغل معي عقلي واستطعت التركيز به 
سأنهيه بإذن الله..

ولكن حاليا  نحن في أخر الشهر وضغط العمل - وعلي انجاز الحسابات واغلاقها قبل نهاية الشهر ..
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
}}}
تم الشكر بواسطة: سعود , سعود , جيولوجي مبتدئ
#5
(26-08-22, 09:29 PM)Taha Okla كتب : اذا اشتغل معي عقلي واستطعت التركيز به 
سأنهيه بإذن الله..

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

الله يقويك 
انا قلت يمكن شيء قدام عيني ماني شايفه (وهذي عادة عندي ) اقصد اني اظن الخطا واضح.
الان البايت byte الواحد  اليس يساوي  رقم ضمن حلقة for ؟
for i=0 to 100 مثلا
اليس الرقم 100 يعني انه صار لدينا ملف بحجم 100 بايت؟
هذا اللذي اريد معرفته لانه لو كان مثل مااتصور لم تحدث المشكلة,,,,,  الملفات المستخرجة تعود بشكل ممتاز و لااشكال و لا خطا في دمجها.
على كل وفق الله الجميع لكل خير.
اللهم إني أعوذ بك من غلبة الدين وغلبة العدو، اللهم إني أعوذ بك من جهد البلاء ومن درك الشقاء ومن سوء القضاء ومن شماتة الأعداء
اللهم اغفر لي خطيئتي وجهلي، وإسرافي في أمري وما أنت أعلم به مني، اللهم اغفر لي ما قدمت وما أخرت، وما أسررت وما أعلنت وما أنت أعلم به مني، أنت المقدم وأنت المؤخر وأنت على كل شيء قدير
}}}
#6
آخر تحديث لاجراء 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 
اللهم إني أعوذ بك من غلبة الدين وغلبة العدو، اللهم إني أعوذ بك من جهد البلاء ومن درك الشقاء ومن سوء القضاء ومن شماتة الأعداء
اللهم اغفر لي خطيئتي وجهلي، وإسرافي في أمري وما أنت أعلم به مني، اللهم اغفر لي ما قدمت وما أخرت، وما أسررت وما أعلنت وما أنت أعلم به مني، أنت المقدم وأنت المؤخر وأنت على كل شيء قدير
}}}
#7
يؤسفني أقول لك لسا ما اكتمل المشروع
استعجلت الجواب

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

ما دام هناك اختلاف يعني انه لا زال هناك عشوائية في تقسيم الملفات وليس تقسيم منظم.
وسينتج عن ذلك اخطاء نتيجة الاستخدام المتكرر - ربما هي غير ظاهرة الان - لكنها ستظهر ..
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
}}}
تم الشكر بواسطة: سعود , جيولوجي مبتدئ
#8
(27-08-22, 05:45 AM)Taha Okla كتب : يؤسفني أقول لك لسا ما اكتمل المشروع
استعجلت الجواب

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

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

فعلا لما غيرت الملف ظهرت المشاكل القديمة.
لكن عرفت اضبط الـ step او الـ value الخاص بالبروقرس بار.
و ان شالله تنحل.
اللهم إني أعوذ بك من غلبة الدين وغلبة العدو، اللهم إني أعوذ بك من جهد البلاء ومن درك الشقاء ومن سوء القضاء ومن شماتة الأعداء
اللهم اغفر لي خطيئتي وجهلي، وإسرافي في أمري وما أنت أعلم به مني، اللهم اغفر لي ما قدمت وما أخرت، وما أسررت وما أعلنت وما أنت أعلم به مني، أنت المقدم وأنت المؤخر وأنت على كل شيء قدير
}}}
#9
طبعا احتراما لهذا المثال اللذي اتعبنيSmile
حبيت احدثه مع انه ناقص لكن هذا افضل تحسين قدرت عليه وهو نفس فكرة  المثال الرئيسي لكن مثل ماقلت تنقصه كود الدمج وهو بسيط


الملفات المرفقة
.zip   NewSplitterAndMerger.zip (الحجم : 15.92 ك ب / التحميلات : 3)
اللهم إني أعوذ بك من غلبة الدين وغلبة العدو، اللهم إني أعوذ بك من جهد البلاء ومن درك الشقاء ومن سوء القضاء ومن شماتة الأعداء
اللهم اغفر لي خطيئتي وجهلي، وإسرافي في أمري وما أنت أعلم به مني، اللهم اغفر لي ما قدمت وما أخرت، وما أسررت وما أعلنت وما أنت أعلم به مني، أنت المقدم وأنت المؤخر وأنت على كل شيء قدير
}}}


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  ماهو حل رسالة الخطأ اللتي تظهر حتى لو انها ضمن Try catch justforit 2 121 28-04-24, 09:45 AM
آخر رد: justforit
  تقسيم الفانورة الي اكثر من ورقة عبدالكريم برشدان 1 126 20-04-24, 02:22 AM
آخر رد: عبدالكريم برشدان
  هل يمكن جعل عناوين الهيدر بشكل عمودي مصمم هاوي 2 159 16-04-24, 03:59 AM
آخر رد: مصمم هاوي
Heart اقدم لكم هدية تصفح منتدى vb4arb.com بشكل أفضل من قبل مع ( vb4arb Code Highlighter ) عبدالله الدوسري 5 1,913 24-01-24, 10:31 PM
آخر رد: annagui
  كيف يتم تعبئة قريد فيو بدون قاعدة بيانات بشكل مباشر؟ nowiglah 1 411 01-12-23, 10:57 PM
آخر رد: Taha Okla
  [سؤال] حول ظهور النافذة الاولى عند الضغط على Menustrip2 في النافذة الثانية vb.net 2012 mh66 0 273 19-10-23, 09:05 AM
آخر رد: mh66
Rainbow [كود] معرفه حجم كل المجلدات في القرص C بشكل واضح محمد مسافر 7 499 10-09-23, 01:56 AM
آخر رد: أبو خالد الشكري
  البرنامج لدي يعمل على ويندوز 11 والان لا يعمل على ويندوز 10 ماهو الحل moh61 1 321 01-09-23, 04:38 AM
آخر رد: اسامه الهرماوي
  هل ممكن اجعل عناصر ال LISTBOX بشكل افقي ismaeel 0 396 01-05-23, 11:26 PM
آخر رد: ismaeel
  تقسيم الاسم الكامل الى اجزاء في الداتا جريد فيو yosif 4 552 13-04-23, 11:15 PM
آخر رد: yosif

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم