يُبلغ GetDiskFreeSpaceEx عن عدد خاطئ من وحدات البايت المجانية

StackOverflow https://stackoverflow.com/questions/627131

  •  06-07-2019
  •  | 
  •  

سؤال

__int64 i64FreeBytes
unsigned __int64 lpFreeBytesAvailableToCaller,
                 lpTotalNumberOfBytes,
                 lpTotalNumberOfFreeBytes; // variables used to obtain 
                                           // the free space on the  drive

GetDiskFreeSpaceEx (Manager.capDir,
(PULARGE_INTEGER)&lpFreeBytesAvailableToCaller,
(PULARGE_INTEGER)&lpTotalNumberOfBytes,
(PULARGE_INTEGER)&lpTotalNumberOfFreeBytes);

i64FreeBytes = lpTotalNumberOfFreeBytes;
_tprintf(_T ("Number of bytes free on the drive:%I64u \n"),
     lpTotalNumberOfFreeBytes);

أنا أعمل على روتين إدارة البيانات وهو تطبيق سطر أوامر Windows CE.يوضح الكود أعلاه كيف أحصل على عدد البايتات المجانية على محرك أقراص معين يحتوي على المجلد Manager.capdir (وهو المتغير الذي يحتوي على اسم المسار الكامل للدليل).

سؤالي هو أن عدد البايتات المجانية التي تم الإبلاغ عنها بواسطة الكود أعلاه (بيان _tprintf) لا يتطابق مع عدد البايتات المجانية لمحرك الأقراص (الذي أتحقق منه عن طريق النقر بزر الماوس الأيمن على محرك الأقراص).

أود أن أعرف ما هو سبب هذا الاختلاف؟

هل كانت مفيدة؟

المحلول

لدي جهاز مستخدم واحد بدون حصة قرص قيد التشغيل.لقد قمت بنشر التعليمات البرمجية الخاصة بك في تطبيق MFC قائم على الحوار وقمت بتشغيله، بشرط واحد وهو أنني استخدمت "C:\" كمعلمة lpDirectoryName حتى أتمكن من المقارنة مع المساحة الحرة لمحرك الأقراص كما أبلغ عنها النظام.بدا ذلك منطقيًا لأن المساحة الحرة لا تعني سوى محرك الأقراص، وليس المجلد.

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

نصائح أخرى

نقلا عن (مع التحرير) وثائق ل GetDiskFreeSpaceEx, ، التأكيد على الألغام:

lpFreeBytesAvailable [خارج، اختياري] -

مؤشر إلى متغير يتلقى إجمالي عدد وحدات البايت المجانية على القرص الذي هو متاح للمستخدم من يرتبط بالدعوة خيط.

يمكن أن تكون هذه المعلمة فارغة.

إذا تم استخدام الحصص النسبية لكل مستخدم ، قد تكون هذه القيمة أقل من الإجمالي عدد البايتات المجانية على القرص.

lpTotalNumberOfBytes [خارج، اختياري] -

مؤشر إلى متغير يتلقى إجمالي عدد البايتات على القرص التي هي متاح للمستخدم المرتبط بخيط الاتصال.

يمكن أن تكون هذه المعلمة فارغة.

إذا تم استخدام الحصص النسبية لكل مستخدم ، قد تكون هذه القيمة أقل من الإجمالي عدد البايتات على القرص.

لتحديد العدد الإجمالي للبايت على قرص أو وحدة تخزين، استخدم IOCTL_DISK_GET_LENGTH_INFO.

بمعنى آخر، يعتمد هذا الرقم على المستخدم، وإذا كنت تريد مطابقة القيمة التي أرجعها Explorer، فاستخدمها lpFreeBytesAvailable.

وأحد الاحتمالات تتبادر إلى الذهن. ربما يكون واحدا وليس مع الأخذ في الاعتبار مساحة خسر أمام التقسيم (النوافذ عادة يترك 8MB في نهاية محرك الأقراص كما الركود). في الأساس، هناك فرق بين الفضاء تركت على محرك الأقراص الفعلي واحد منطقي ممثلة القسم. أو الفضاء خسر أمام نظام الملفات نفسها.

وأنا لا أستطيع أن أقول إذا كانت هذه هي الحال في الواقع، ولكن أود أن ننظر في ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top