"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني استخدام وظيفة GetVolumeInformation في GoLang لاسترداد اسم وحدة التخزين في Windows؟

كيف يمكنني استخدام وظيفة GetVolumeInformation في GoLang لاسترداد اسم وحدة التخزين في Windows؟

تم النشر بتاريخ 2024-10-31
تصفح:909

How can I use the GetVolumeInformation function in GoLang to retrieve the name of a storage volume in Windows?

كيفية استخدام وظيفة GetVolumeInformation في GoLang للحصول على أسماء وحدات التخزين

عند العمل مع أنظمة Windows، غالبًا ما يجد المطورون الحاجة إلى التفاعل مع نظام ملفات نظام التشغيل و استرجاع المعلومات حول أحجام التخزين. إحدى الوظائف الأساسية لهذا الغرض هي GetVolumeInformation، والتي توفر تفاصيل حول وحدة تخزين قرص محددة.

في هذه المقالة، نستكشف كيفية الاستفادة من وظيفة GetVolumeInformation في GoLang للتأكد من اسم وحدة تخزين معينة.

استخدام GetVolumeInformation في GoLang

لاسترداد اسم المجلد باستخدام وظيفة GetVolumeInformation، نحتاج إلى الالتزام بالخطوات التالية:

  1. تحميل مكتبة Kernel32: أولا يجب علينا تحميل مكتبة "kernel32.dll" التي تحتوي على وظيفة GetVolumeInformation.
  2. الحصول على مؤشر الوظيفة: داخل مكتبة kernel32، نقوم باسترجاع مؤشر الوظيفة لـ احصل على معلومات الحجمW. تعمل هذه الوظيفة مع سلاسل أحرف واسعة (UTF-16)، مما يسمح لنا بالتعامل مع أحرف Unicode.
  3. إعداد وسيطات الإدخال:
  4. تتطلب وظيفة GetVolumeInformation عدة وسائط إدخال، مثل المسار الجذر اسم المجلد الذي نريد فحصه. نقوم أيضًا بإنشاء مخازن مؤقتة لتلقي اسم وحدة التخزين والرقم التسلسلي واسم نظام الملفات والبيانات الوصفية الأخرى.
  5. استدعاء GetVolumeInformation:
  6. بمجرد إعداد وسيطات الإدخال، نقوم باستدعاء وظيفة GetVolumeInformationW عبر syscall.Syscall9. تأخذ هذه الوظيفة عدة وسائط وتقوم بإرجاع رمز الحالة.
  7. التعامل مع النتيجة:
  8. إذا كان تنفيذ الوظيفة ناجحًا، فيمكننا الوصول إلى المعلومات المتعلقة بوحدة التخزين، بما في ذلك اسم وحدة التخزين المخزنة في المخزن المؤقت المخصص.
  9. مثال للتعليمات البرمجية

إليك مثال لمقتطف التعليمات البرمجية يوضح كيفية استخدام وظيفة GetVolumeInformation في GoLang:

الحزمة الرئيسية يستورد ( "إف إم تي" "نداء النظام" "غير آمن" ) الوظيفة الرئيسية () { فار lpRootPathName = "C:\\" فار lpVolumeNameBuffer = make([]uint16, syscall.MAX_PATH 1) فار nVolumeNameSize = uint32(len(lpVolumeNameBuffer)) فار lpVolumeSerialNumber uint32 فار lpMaximumComponentLength uint32 فار lpFileSystemFlags uint32 فار lpFileSystemNameBuffer = make([]uint16, 255) فار nFileSystemNameSize uint32 = syscall.MAX_PATH 1 kernel32، _ := syscall.LoadLibrary("kernel32.dll") getVolume، _ := syscall.GetProcAddress(kernel32, "GetVolumeInformationW") فار نارجس uintptr = 8 ret, _, callErr := syscall.Syscall9(uintptr(getVolume), نرجس, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpRootPathName))), uintptr(unsafe.Pointer(&lpVolumeNameBuffer[0]))), uintptr(nVolumeNameSize), uintptr(unsafe.Pointer(&lpVolumeSerialNumber))), uintptr(unsafe.Pointer(&lpMaximumComponentLength))), uintptr(unsafe.Pointer(&lpFileSystemFlags)), uintptr(unsafe.Pointer(&lpFileSystemNameBuffer[0]))), uintptr(nFileSystemNameSize), 0) fmt.Println(ret, callErr, syscall.UTF16ToString(lpVolumeNameBuffer))

package main

import (
    "fmt"
    "syscall"
    "unsafe"
)

func main() {
    var lpRootPathName = "C:\\"
    var lpVolumeNameBuffer = make([]uint16, syscall.MAX_PATH 1)
    var nVolumeNameSize = uint32(len(lpVolumeNameBuffer))
    var lpVolumeSerialNumber uint32
    var lpMaximumComponentLength uint32
    var lpFileSystemFlags uint32
    var lpFileSystemNameBuffer = make([]uint16, 255)
    var nFileSystemNameSize uint32 = syscall.MAX_PATH   1

    kernel32, _ := syscall.LoadLibrary("kernel32.dll")
    getVolume, _ := syscall.GetProcAddress(kernel32, "GetVolumeInformationW")

    var nargs uintptr = 8
    ret, _, callErr := syscall.Syscall9(uintptr(getVolume),
        nargs,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpRootPathName))),
        uintptr(unsafe.Pointer(&lpVolumeNameBuffer[0])),
        uintptr(nVolumeNameSize),
        uintptr(unsafe.Pointer(&lpVolumeSerialNumber)),
        uintptr(unsafe.Pointer(&lpMaximumComponentLength)),
        uintptr(unsafe.Pointer(&lpFileSystemFlags)),
        uintptr(unsafe.Pointer(&lpFileSystemNameBuffer[0])),
        uintptr(nFileSystemNameSize),
        0)
    fmt.Println(ret, callErr, syscall.UTF16ToString(lpVolumeNameBuffer))
}

أحد الجوانب المهمة التي يجب تذكرها عند استخدام GetVolumeInformation هو أنها تعمل على سلاسل أحرف واسعة (UTF-16). ونتيجة لذلك، يجب علينا التأكد من أن جميع السلاسل التي تم تمريرها إلى الدالة وإرجاعها تكون بتنسيق UTF-16. قد يؤدي الفشل في القيام بذلك إلى نتائج غير متوقعة.

الاستنتاج

توفر وظيفة GetVolumeInformation طريقة فعالة للحصول على معلومات شاملة حول أحجام التخزين في GoLang. باتباع الخطوات الموضحة في هذه المقالة، يمكنك استرداد أسماء المجلدات والتفاصيل الأساسية الأخرى بنجاح لتلبية احتياجات التطبيق الخاص بك.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3