تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيفية قراءة ملف باستخدام IntPtr الخاص بالملف
#1
الكلاسان التاليان الهدف منهما تحويل اسم الملف و مكانه علي الكمبيوتر الي IntPtr ثم باستخدام هذا IntPtr نقوم بفتح الملف و قراءته
الكلاسان مكتوبان بنسخة الفيجوال استوديو 2015
وربما الكلاسلات لا تصلح للعمل من النسخ القديمة من الفيجوال استوديو
عموما إن وجدت أخطاء في الكلاسلات عند استخدامها مع الفيجوال استوديو الخاص بك رجاء أن تترك كومنت و سأوضح لك لاحقا كيفية اعادة كتابتهم ليتناسبا مع النسخ القديمة من الفيجوال استوديو

الكلاس الأول
هذا الكلاس نمرر له البيانات او المدخلات علي هيئة String ومن ثم يتم تحويل String الي IntPtr
يمكن استخدام الكلاس منفردا


PHP كود :
Public Class CairoIntPtr
    Inherits MarshalByRefObject
    Implements IDisposable

    Private _disposed 
As Boolean
    Private _handle 
As IntPtr

    Public Sub 
New(As String)
 
       Dim func As Func(Of StringIntPtr) = Function(str)
 
                                                 Dim ptr As IntPtr CType(NothingIntPtr)
 
                                                 ptr System.Runtime.InteropServices.Marshal.StringToHGlobalUni(str)
 
                                                 Return ptr
                                              End 
Function
 
       Dim zero As Func(Of IntPtr) = Function() IntPtr.Zero
        _handle 
= If(Not String.IsNullOrEmpty(s), func(s), zero)
 
   End Sub

    Public ReadOnly Property Handle
() As Integer
        Get
            Return Me
._handle
        End Get
    End Property

    Public ReadOnly Property ToInt32 
As Int32
        Get
            Return Convert
.ToInt32(Me.Handle)
 
       End Get
    End Property

    Public ReadOnly Property ToInt64 
As Int64
        Get
            Return Convert
.ToInt64(Me.Handle)
 
       End Get
    End Property

    Private Sub DisposeInternal
()
 
       If Me._handle <> 0 Then
            Dim action 
As Action(Of IntPtr) = Sub(ptr As IntPtr)
 
                                                 System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr)
 
                                             End Sub
            action
(_handle)
 
           Me._handle 0
        End 
If
 
   End Sub

    
' هذه الدالة يفترض أن تكون في كلاس أخر
    ' 
لكنني كتبتها هنا من أجل توضيح الفكرة 
    Public Shared 
Function IntPtrToString(ptr As IntPtr) As String
        Dim result 
As String System.Runtime.InteropServices.Marshal.PtrToStringUni(ptr)
 
       Return result
    End 
Function

 
   Protected Overridable Sub Dispose(disposing As Boolean)
 
       If _disposed Then
            Return
        End 
If

 
       If disposing Then
            Me
.DisposeInternal()
 
       End If

 
       _disposed True
    End Sub

    Public Overrides 
Function Equals(obj As Object) As Boolean
        Return obj IsNot Nothing AndAlso obj
.[GetType]() Is MyBase.[GetType]() AndAlso (CType(objCairoIntPtr))._handle Me.Handle
    End 
Function

 
   Public Overrides Function GetHashCode() As Integer
        Return Me
._handle.GetHashCode()
 
   End Function

 
   Protected Overrides Sub Finalize()
 
       Dispose(False)
 
       MyBase.Finalize()
 
   End Sub

    Public Sub Dispose
() Implements IDisposable.Dispose
        Dispose
(True)
 
       GC.SuppressFinalize(Me)
 
   End Sub

End 
Class 

الكلاس الثاني
هذا الكلاس نمرر له اسم الملف و يقوم بتحويل الملف الي مصفوفة من Byte و ايضا الي MemoryStream و هذا الكلاس مناسب للعمل مع اي ملف من اي نوع
يمكن استخدام الكلاس منفردا كيفما يحلو للمستخدم


PHP كود :
Public Class CairoFile

    Private _data 
As Byte()

 
   Public Sub New(filePath As String)
 
       Me._data = (If(Not String.IsNullOrEmpty(filePath), (New Lazy(Of Byte())(Function() IO.File.ReadAllBytes(filePath))).Value, (New Lazy(Of Byte())(Function() New Byte() {})).Value))
 
   End Sub

    Public ReadOnly Property ToBytes 
As Byte()
 
       Get
            Return Me
._data
        End Get
    End Property

    Public ReadOnly Property ToStream 
As IO.MemoryStream
        Get
            Return 
New IO.MemoryStream(ToBytes())
 
       End Get
    End Property
End 
Class 

الاستخدام

و هنا سوف استخدم الكلاسان لقراءة صورة موجودة في فهرس المشروع
عن طريق تحويل اسم الملف ومكانه علي الكمبيوتر الي IntPtr ومن ثم عرض الصورة كخلفية للفورم
لاحقا ربما اٌقوم بالتعديل علي الكلاس الثاني CairoFile لتكون المدخلات له عبارة عن IntPtr و ليس String


PHP كود :
       Dim filePath As String ".\tmp-0.gif"
 
       Dim ptr As IntPtr = New CairoIntPtr(filePath).Handle

        If IO
.File.Exists(CairoIntPtr.IntPtrToString(ptr)) Then
            Dim cf 
As New CairoFile(filePath)
 
           Me.BackgroundImageLayout ImageLayout.Center
            Me
.BackgroundImage Image.FromStream(cf.ToStream)
 
       End If 


اتمني يكون الكلاسان مفيدان للبعض منكم
الرد
تم الشكر بواسطة: ابو ليلى , ali.alfoly , ali.alfoly , bidaya , bidaya
#2
جزاك الله كل خير يا اخ عمر وزادك من علمه , مجهود كبير و واضح وشغل على اصوله
تحياتي لك
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة: silverlight , ali.alfoly
#3
أشكرك لكن فقط كن حذرا عند استخدام الكلاسات لأنها تتعامل مع ملفات يجب أن تكون موجودة فعلا علي الكمبيوتر غير هذا قد ينتج خطأ
الرد
تم الشكر بواسطة: ali.alfoly , ali.alfoly
#4
الكلاسات بعد التعديل عليها قليلا
الكلاسات مكتوبة باستخدام الفيحوال استوديو 2015
استخدامهم مع نسخ قديمة قد يؤدي الي خطأ في الكود


PHP كود :
Public Class CairoDataFile

    Private _data 
As Byte()
 
   Private _cairo As String
    Public Sub 
New(ptr As IntPtr)
 
       Dim func As Func(Of IntPtrString) = Function(pSystem.Runtime.InteropServices.Marshal.PtrToStringUni(p)
 
       _cairo = If(Nothingfunc(ptr))
 
       Me._data = (If(Not String.IsNullOrEmpty(_cairo), (New Lazy(Of Byte())(Function() IO.File.ReadAllBytes(_cairo))).Value, (New Lazy(Of Byte())(Function() New Byte() {})).Value))
 
   End Sub

    Public ReadOnly Property ToText 
As String
        Get
            Return _cairo
        End Get
    End Property

    Public ReadOnly Property ToBytes 
As Byte()
 
       Get
            Return Me
._data
        End Get
    End Property

    Public ReadOnly Property ToStream 
As IO.MemoryStream
        Get
            Return 
New IO.MemoryStream(ToBytes())
 
       End Get
    End Property

End 
Class 

PHP كود :
Public Class CairoIntPtr
    Inherits MarshalByRefObject
    Implements IDisposable

    Private _disposed 
As Boolean
    Private _handle 
As IntPtr

    Public Sub 
New(As String)
 
       Dim func As Func(Of StringIntPtr) = Function(str)
 
                                                 Dim ptr As IntPtr CType(NothingIntPtr)
 
                                                 ptr System.Runtime.InteropServices.Marshal.StringToHGlobalUni(str)
 
                                                 Return ptr
                                              End 
Function
 
       Dim zero As Func(Of IntPtr) = Function() IntPtr.Zero
        _handle 
= If(Not String.IsNullOrEmpty(s), func(s), zero)
 
   End Sub

    Public ReadOnly Property Handle
() As Integer
        Get
            Return Me
._handle
        End Get
    End Property

    Public ReadOnly Property ToInt32 
As Int32
        Get
            Return Convert
.ToInt32(Me.Handle)
 
       End Get
    End Property

    Public ReadOnly Property ToInt64 
As Int64
        Get
            Return Convert
.ToInt64(Me.Handle)
 
       End Get
    End Property

    Private Sub DisposeInternal
()
 
       If Me._handle <> 0 Then
            Dim action 
As Action(Of IntPtr) = Sub(ptr As IntPtr)
 
                                                 System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr)
 
                                             End Sub
            action
(_handle)
 
           Me._handle 0
        End 
If
 
   End Sub

    Protected Overridable Sub Dispose
(disposing As Boolean)
 
       If _disposed Then
            Return
        End 
If

 
       If disposing Then
            Me
.DisposeInternal()
 
       End If

 
       _disposed True
    End Sub

    Public Overrides 
Function Equals(obj As Object) As Boolean
        Return obj IsNot Nothing AndAlso obj
.[GetType]() Is MyBase.[GetType]() AndAlso (CType(objCairoIntPtr))._handle Me.Handle
    End 
Function

 
   Public Overrides Function GetHashCode() As Integer
        Return Me
._handle.GetHashCode()
 
   End Function

 
   Protected Overrides Sub Finalize()
 
       Dispose(False)
 
       MyBase.Finalize()
 
   End Sub

    Public Sub Dispose
() Implements IDisposable.Dispose
        Dispose
(True)
 
       GC.SuppressFinalize(Me)
 
   End Sub

End 
Class 

الإستخدام
يُنصح باستخدام الكلاسات مع بيانات موجودة فعليا علي الكمبيوتر
تمرير بيانات خاطئة قد يؤدي الي Exceptions و حتي الأن هذا لم يتم مراعاته في الكود المكتوب


PHP كود :
       Dim filePath As String ".\tmp-0.gif"
 
       Dim ptr As IntPtr = New CairoIntPtr(filePath).Handle
        Dim cdf 
As New CairoDataFile(ptr)
 
       If IO.File.Exists(cdf.ToTextThen
            Me
.BackgroundImageLayout ImageLayout.Center
            Me
.BackgroundImage Image.FromStream(cdf.ToStream)
 
       End If 

يُنصح بالاستغناء عن هذا الجزء من الكود في الكلاس CairoDataFile
لقد تم كتابته في الكلاس للتوضيح فقط لا غير


PHP كود :
   Public ReadOnly Property ToStream As IO.MemoryStream
        Get
            Return 
New IO.MemoryStream(ToBytes())
 
       End Get
    End Property 
الرد
تم الشكر بواسطة: الشاكي لله , ali.alfoly , ابو ليلى


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [VB.NET] كيفية استخدام اداوات ديف اكسبريس devexpressلادخال السجلات الى قاعدة بيانات نوع اكسس 13adam123 0 306 29-03-20, 12:50 PM
آخر رد: 13adam123
Star [مقال] كيفية تحويل اسعار العملات بإستخدام Yahoo Exchange Rates Web Service Programmation 9 5,316 22-02-20, 12:58 PM
آخر رد: دمعة المقهور
Exclamation كيفية تجاوز ظهور الخطا في Global.WindowsApplication1.My.Resources الرائد 0 641 13-08-19, 11:40 PM
آخر رد: الرائد
  [درس فيديو] كيفية استخدام الجملة الشرطية if alims 1 649 22-07-19, 06:38 AM
آخر رد: سعود
Star حماية السورس كود الخاص بك من الكسر مجانا YousefOkasha 6 2,517 21-04-19, 12:41 PM
آخر رد: YousefOkasha
  لفهم كيفية الربط الذي يتم بين الجداول viv 3 1,428 14-03-19, 01:53 PM
آخر رد: تعليموه
  كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : مبرمج أوتار 4 18,095 21-01-19, 03:43 PM
آخر رد: elgokr
Photo كيفية اطهار جدول داخل الأخر alsouf 0 508 30-10-18, 05:55 PM
آخر رد: alsouf
  اصنع محرر أكواد خاص بك باستخدام الأداة RichTextBox السكر المغرور 13 4,296 19-08-18, 09:27 AM
آخر رد: elgokr
  [مشروع] تعلم كيف تصنع برنامج لنشر منشورات لحساب الفيس بوك الخاص بك Basil Abdallah 8 3,433 01-07-18, 01:21 AM
آخر رد: YousefOkasha

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


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