سؤال

أحتاج إلى معرفة مقدار المخزن المؤقت في الذاكرة المعطى سيكون كملف على القرص (عصا USB) قبل أن أكتبه. أعلم أنه ما لم يسقط الحجم على حدود حجم الكتلة، من المحتمل أن يتم تقريبه، مثل ملف 1 بايت يأخذ 4096 بايت على القرص. أنا حاليا أفعل هذا باستخدام getdiskfreespace () لحل حجم كتلة القرص، ثم استخدام هذا لحساب حجم على القرص مثل هذا:

GetDiskFreeSpace(szDrive, &dwSectorsPerCluster, 
                 &dwBytesPerSector, NULL, NULL);

dwBlockSize = dwSectorsPerCuster * dwBytesPerSector;

if (dwInMemorySize % dwBlockSize != 0)
{
    dwSizeOnDisk = ((dwInMemorySize / dwBlockSize) * dwBlockSize) + dwBlockSize;
}
else
{
    dwSizeOnDisk = dwInMemorySize;
}

التي يبدو أنها تعمل بشكل جيد، لكن getdiskfreespace () يعمل فقط على الأقراص حتى 2 جيجابايت وفقا ل MSDN. getdiskfreespaceex () لا يعيد نفس المعلومات، لذلك سؤالي هو، كيف يمكنني حساب هذه المعلومات لمحركات الأقراص> 2 جيجابايت؟ هل هناك دعوة API التي فاتنيها؟ هل يمكنني تحمل بعض القيم الصلبة حسب حجم القرص العام؟

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

المحلول

MSDN تنص فقط على أن GetDiskFreeSpace() وظيفة لا يمكن الإبلاغ عنها أحجام التخزين أكبر من 2GB. إنه يعمل بشكل جيد لاسترجاع القطاعات لكل كتلة وحيات البايت لكل قطاع، لقد استخدمته بنفسي للحصول على رمز مشابه للغاية ؛-)

ولكن إذا كنت تريد قدرة القرص أيضا، فستحتاج إلى مكالمة إضافية GetDiskFreeSpaceEx().

نصائح أخرى

حجم الملف على القرص هو مفهوم غامض. في NTFS، يتكون ملف من مجموعة من عناصر البيانات. أنت تفكير برائي في "دفق البيانات غير المسمى". هذه سمة لملف، إذا كانت صغيرة، يمكن تعبئتها بالسمات الأخرى في إدخال الدليل. فيما يبدو, ، يمكنك تخزين دفق البيانات يصل إلى 700-800 بايت في إدخال الدليل نفسه. وبالتالي، فإن ملفك 1 بايت 1 سيكون كبيرا مثل ملف 0 بايت أو 700 بايت.

تأثير آخر هو ضغط الملفات. سيؤدي ذلك إلى جعل الحجم على القرص يحتمل أن يكون أصغر من حجم الذاكرة.

يجب أن تكون قادرا على الحصول على هذه المعلومات باستخدام وظيفة DeviceioControl و
disk_geometry_ex. سيعود بنية تحتوي على المعلومات التي تبحث عنها

http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx.

http://msdn.microsoft.com/en-us/library/ms809010.aspx.

في ActionScript!

var size:Number = 19912;
var sizeOnDisk:Number = size;
var reminder:Number = size % (1024 * 4);
if(reminder>0){
    sizeOnDisk = size + ((1024 * 4)- reminder)
}
trace(size)
trace(sizeOnDisk)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top