第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何計(jì)算文件夾的大?。?/h1>

如何計(jì)算文件夾的大?。?/h1>
iOS
DIEA 2019-10-08 09:53:32
我正在創(chuàng)建一個(gè)文件夾,以使用iPhone App在“文檔”中緩存圖像。我希望能夠?qū)⒋宋募A的大小減小到1MB,因此我需要檢查文件夾的大?。ㄒ宰止?jié)為單位)。我有代碼來計(jì)算文件的大小,但是我需要文件夾的大小。最好的方法是什么?
查看完整描述

3 回答

?
開心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

tl; dr

所有其他答案都關(guān)閉了:)


問題

我想在這個(gè)老問題上加上兩分錢,因?yàn)樗坪跤泻芏啻鸢付挤浅O嗨疲谀承┣闆r下得出的結(jié)果卻非常不準(zhǔn)確。


要了解為什么我們首先必須定義文件夾的大小。以我的理解(可能是OP之一),它是目錄(包括其所有內(nèi)容)在卷上使用的字節(jié)數(shù)。或者,換一種說法:


如果目錄將被完全刪除,則該空間變?yōu)榭捎谩?/p>


我知道,此定義不是解釋問題的唯一有效方法,但我確實(shí)認(rèn)為這是大多數(shù)用例的根源。


錯(cuò)誤

現(xiàn)有的答案都采用非常簡單的方法:遍歷目錄內(nèi)容,增加(常規(guī))文件的大小。這并沒有考慮到一些微妙之處。


卷上使用的空間以塊為單位遞增,而不是以字節(jié)為單位遞增。即使是一個(gè)字節(jié)的文件也至少使用一個(gè)塊。

文件包含元數(shù)據(jù)(如任意數(shù)量的擴(kuò)展屬性)。此數(shù)據(jù)必須放在某處。

HFS部署文件系統(tǒng)壓縮,以實(shí)際使用較少的字節(jié)(而不是其實(shí)際長度)存儲文件。

所有這些原因使現(xiàn)有的答案產(chǎn)生不精確的結(jié)果。因此,我提議對此擴(kuò)展NSFileManager(由于長度而在github 上的代碼:Swift 4,Objective C)來解決這個(gè)問題。它的速度也相當(dāng)快,特別是對于包含大量文件的目錄。


該解決方案的核心是使用NSURL的NSURLTotalFileAllocatedSizeKey或NSURLFileAllocatedSizeKey性的判定來檢索文件的大小。


測試

我還建立了一個(gè)簡單的iOS測試項(xiàng)目,展示了解決方案之間的差異。它顯示了在某些情況下結(jié)果可能完全錯(cuò)誤。


在測試中,我創(chuàng)建了一個(gè)包含100個(gè)小文件的目錄(范圍從0到800字節(jié))。folderSize:從其他答案中復(fù)制的方法總共計(jì)算出21 kB,而我的allocatedSize方法得出的結(jié)果為401 kB。


證明

allocatedSize通過計(jì)算刪除測試目錄之前和之后卷上可用字節(jié)的差異,我確保的結(jié)果更接近正確的值。在我的測試中,差異始終等于的結(jié)果allocatedSize。


請參閱Rob Napier的評論,以了解仍有改進(jìn)的空間。


性能

但是還有另一個(gè)優(yōu)點(diǎn):在計(jì)算包含1000個(gè)文件的目錄的大小時(shí),在我的iPhone 6上,此folderSize:方法大約需要250毫秒,而allocatedSize在35毫秒內(nèi)遍歷相同的層次結(jié)構(gòu)。


這可能是由于使用NSFileManager的new(ish)enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:API遍歷了層次結(jié)構(gòu)。通過此方法,您可以為要迭代的項(xiàng)目指定預(yù)取屬性,從而減少io。


結(jié)果

Test `folderSize` (100 test files)

    size: 21 KB (21.368 bytes)

    time: 0.055 s

    actual bytes: 401 KB (401.408 bytes)


Test `allocatedSize` (100 test files)

    size: 401 KB (401.408 bytes)

    time: 0.048 s

    actual bytes: 401 KB (401.408 bytes)


Test `folderSize` (1000 test files)

    size: 2 MB (2.013.068 bytes)

    time: 0.263 s

    actual bytes: 4,1 MB (4.087.808 bytes)


Test `allocatedSize` (1000 test files)

    size: 4,1 MB (4.087.808 bytes)

    time: 0.034 s

    actual bytes: 4,1 MB (4.087.808 bytes)


查看完整回答
反對 回復(fù) 2019-10-08
?
阿晨1998

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊

為亞歷克斯加油打氣,您已經(jīng)提供了很多幫助,現(xiàn)在已經(jīng)編寫了以下功能,可以發(fā)揮作用...


- (unsigned long long int)folderSize:(NSString *)folderPath {

    NSArray *filesArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:folderPath error:nil];

    NSEnumerator *filesEnumerator = [filesArray objectEnumerator];

    NSString *fileName;

    unsigned long long int fileSize = 0;


    while (fileName = [filesEnumerator nextObject]) {

        NSDictionary *fileDictionary = [[NSFileManager defaultManager] fileAttributesAtPath:[folderPath stringByAppendingPathComponent:fileName] traverseLink:YES];

        fileSize += [fileDictionary fileSize];

    }


    return fileSize;

}

它提供了與Finder一樣的確切字節(jié)數(shù)。


順便說一句,F(xiàn)inder返回兩個(gè)數(shù)字。一個(gè)是磁盤上的大小,另一個(gè)是實(shí)際的字節(jié)數(shù)。


例如,當(dāng)我在一個(gè)文件夾中運(yùn)行此代碼時(shí),它以130398的“文件大小”返回代碼中。當(dāng)我在Finder中簽入時(shí),它說磁盤上的大小為201KB(130,398字節(jié))。


有點(diǎn)不確定此處的實(shí)際大?。?01KB或130,398字節(jié))?,F(xiàn)在,我會安全地將限制減少一半,直到我知道這到底意味著什么...


如果有人可以向這些不同的號碼添加更多信息,我將不勝感激。


干杯,


查看完整回答
反對 回復(fù) 2019-10-08
  • 3 回答
  • 0 關(guān)注
  • 747 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號