मैंने इस फ़ंक्शन में एक द्विआधारी परीक्षण की निंदा की है जिसका मैं उपयोग करता हूं:
function getStorageTotalSize(upperLimit/*in bytes*/) {
var store = localStorage, testkey = "$_test"; // (NOTE: Test key is part of the storage!!! It should also be an even number of characters)
var test = function (_size) { try { store.removeItem(testkey); store.setItem(testkey, new Array(_size + 1).join('0')); } catch (_ex) { return false; } return true; }
var backup = {};
for (var i = 0, n = store.length; i < n; ++i) backup[store.key(i)] = store.getItem(store.key(i));
store.clear(); // (you could iterate over the items and backup first then restore later)
var low = 0, high = 1, _upperLimit = (upperLimit || 1024 * 1024 * 1024) / 2, upperTest = true;
while ((upperTest = test(high)) && high < _upperLimit) { low = high; high *= 2; }
if (!upperTest) {
var half = ~~((high - low + 1) / 2); // (~~ is a faster Math.floor())
high -= half;
while (half > 0) high += (half = ~~(half / 2)) * (test(high) ? 1 : -1);
high = testkey.length + high;
}
if (high > _upperLimit) high = _upperLimit;
store.removeItem(testkey);
for (var p in backup) store.setItem(p, backup[p]);
return high * 2; // (*2 because of Unicode storage)
}
यह भी परीक्षण से पहले सामग्री का समर्थन करता है, फिर उन्हें पुनर्स्थापित करता है।
यह कैसे काम करता है: यह आकार तक दोगुना हो जाता है जब तक कि सीमा पूरी नहीं हो जाती या परीक्षण विफल हो जाता है। यह तब कम और उच्च और घटाव के बीच की आधी दूरी को संग्रहीत करता है / हर बार आधे का आधा जोड़ता है (असफलता पर घटाना और सफलता में जोड़ना); उचित मूल्य में सम्मान।
upperLimit
डिफ़ॉल्ट रूप से 1GB है, और बाइनरी खोज शुरू करने से पहले घातीय स्कैन करने के लिए सिर्फ ऊपर की तरफ कितनी सीमा है। मुझे संदेह है कि इसे बदलने की आवश्यकता होगी, लेकिन मैं हमेशा आगे की सोच रहा हूं। ;)
क्रोम पर:
> getStorageTotalSize();
> 10485762
> 10485762/2
> 5242881
> localStorage.setItem("a", new Array(5242880).join("0")) // works
> localStorage.setItem("a", new Array(5242881).join("0")) // fails ('a' takes one spot [2 bytes])
IE11, Edge और FireFox भी एक ही अधिकतम आकार (10485762 बाइट्स) की रिपोर्ट करते हैं।