專利名稱:用于管理和編輯文件系統(tǒng)中文件的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及存儲(chǔ)裝置,例如個(gè)人視頻錄像機(jī)(Personal VideoRecorder/PVR)。具 體而言,本發(fā)明涉及用于管理和編輯文件系統(tǒng)中文件的方法和裝置。
背景技術(shù):
當(dāng)前,個(gè)人視頻錄像機(jī)應(yīng)用在機(jī)頂盒(Set Top Box)中廣泛采用。用戶有時(shí)需要編 輯其視頻記錄,例如,用戶需要?jiǎng)h除文件以除去商業(yè)廣告(commercials)。但是,商業(yè)廣告有 可能位于視頻記錄的任何位置,因此用戶就需要從視頻記錄文件的各個(gè)位置刪除數(shù)據(jù)。艮口, 用戶可能需要從視頻記錄文件的開始、中間或尾部位置刪除商業(yè)廣告。圖1是傳統(tǒng)文件系統(tǒng)的實(shí)例,例如FAT 32或者EXT 2。在此文件系統(tǒng)中,文件通 常存儲(chǔ)在多個(gè)塊(block)中。在圖1中,使用10個(gè)塊來(lái)存儲(chǔ)文件。塊是最小的配置單位 (allocation unit),并包含16個(gè)扇區(qū)(sector)。一個(gè)扇區(qū)中有512個(gè)字節(jié)(byte),因此 通常一個(gè)塊具有8K字節(jié)。在順序文件(sequential file)中,通過(guò)文件管理系統(tǒng)將全部塊 連接(link)在一起。對(duì)于每個(gè)塊,連接信息可以包括前指數(shù)(例如當(dāng)前塊之前塊的編號(hào)) 和后指數(shù)(例如當(dāng)前塊之后塊的編號(hào))。通常文件管理系統(tǒng)知道文件從哪里開始(即起始 塊號(hào))以及文件占據(jù)的空間長(zhǎng)度(即使用多少塊來(lái)存儲(chǔ)此文件)。文件的實(shí)際長(zhǎng)度有可能 小于文件占據(jù)的空間長(zhǎng)度。在此傳統(tǒng)文件系統(tǒng)中,從文件尾部刪除數(shù)據(jù)(例如除去商業(yè)廣告)比較容易。如果 是在文件尾部進(jìn)行刪除,則刪除的數(shù)據(jù)將被直接釋放。但是,很難從文件的中部、特別是從 某些塊的部分刪除數(shù)據(jù)。如果從塊的某些部分刪除數(shù)據(jù),則該塊將不是一個(gè)完整的塊(非 完整塊),即該塊中的數(shù)據(jù)小于8K。在這種條件下,傳統(tǒng)處理方法是將后續(xù)塊的數(shù)據(jù)移動(dòng)以 填充(fill)非完整塊。這樣做的原因是,在傳統(tǒng)文件系統(tǒng)中,文件管理系統(tǒng)只記錄起始?jí)K 號(hào)和文件長(zhǎng)度(即使用了多少個(gè)塊來(lái)存儲(chǔ)文件),因此即使將某些數(shù)據(jù)從塊中刪除,還需要 一定時(shí)間對(duì)塊的該部分進(jìn)行讀出。但是,移動(dòng)后續(xù)塊以填補(bǔ)非完整塊將需要處理時(shí)間,特別 是對(duì)于比較大的文件。為了解決傳統(tǒng)文件系統(tǒng)中存在的問(wèn)題,JP 2003 052006公開了一種信息編輯控 制器,通過(guò)減少在編輯視頻和音頻數(shù)據(jù)過(guò)程中對(duì)介質(zhì)的讀/寫訪問(wèn)帶來(lái)的復(fù)制操作(copy operation)而實(shí)現(xiàn)高速編輯。
發(fā)明內(nèi)容
本發(fā)明的第一方面提供了一種用于管理文件系統(tǒng)中的文件數(shù)據(jù)的方法。在所述文 件系統(tǒng)中,將用于存儲(chǔ)文件數(shù)據(jù)的存儲(chǔ)空間分為多個(gè)大小相同并且順序編號(hào)的塊。所述塊 設(shè)置在順序編號(hào)的組塊(chunk)中,并且每個(gè)組塊包括至少一個(gè)塊。對(duì)于一個(gè)組塊,所述方 法包括下述步驟在刪除文件中的數(shù)據(jù)的步驟之后,利用第一管理數(shù)據(jù)和第二管理數(shù)據(jù)記 錄每個(gè)組塊中的第一塊的頭部和最后塊的尾部中未被數(shù)據(jù)占據(jù)的空間大小,所述空間大小 小于塊的大小。
根據(jù)一個(gè)實(shí)施方式,所述刪除步驟包括從所述組塊的頭部或者尾部刪除數(shù)據(jù)。根據(jù)一個(gè)實(shí)施方式,連接(link)包含給定文件的數(shù)據(jù)的組塊,連接信息記錄在文 件系統(tǒng)管理數(shù)據(jù)中。另外,如果一個(gè)組塊被完全刪除,釋放用于所述刪除的組塊的存儲(chǔ)空間并連接被 刪除的組塊的前面和后面的組塊。本發(fā)明的第二方面提供了一種用于管理文件系統(tǒng)中的文件數(shù)據(jù)的方法。在所述文 件系統(tǒng)中,將用于存儲(chǔ)文件數(shù)據(jù)的存儲(chǔ)空間分為多個(gè)大小相同并且順序編號(hào)的塊。所述塊 設(shè)置在順序編號(hào)的組塊中,并且每個(gè)組塊包括至少一個(gè)塊。對(duì)于一個(gè)組塊,所述方法包括下 述步驟在刪除文件中的數(shù)據(jù)的步驟之后,利用第一管理數(shù)據(jù)和第二管理數(shù)據(jù)記錄每個(gè)組 塊中的第一塊的頭部和最后塊的尾部中未被數(shù)據(jù)占據(jù)的空間大小,所述空間大小小于塊的 大小。當(dāng)文件部分被刪除并且刪除起始位置和尾部位置沒(méi)有位于相同的塊中但是位于相 同的組塊中時(shí),所述組塊被分為第一新組塊和第二新組塊。在此情況下,采用第三管理數(shù) 據(jù)和第四管理數(shù)據(jù)分別記錄第二新組塊的第一塊的頭部以及最后塊的尾部中的空閑空間 (empty space),并且連接第一新組塊和第二新組塊以保持文件的連續(xù)性。根據(jù)一個(gè)實(shí)施方式,采用刪除之前原組塊號(hào)對(duì)第一新組塊進(jìn)行編號(hào),緊隨文件系 統(tǒng)中最初的最后組塊號(hào)對(duì)第二新組塊進(jìn)行編號(hào)。根據(jù)一個(gè)實(shí)施方式,如果一個(gè)塊中的數(shù)據(jù)被完全刪除,釋放該塊的空間。本發(fā)明的第三方面提供了 一種用于管理文件系統(tǒng)中的文件數(shù)據(jù)的方法。在所述文 件系統(tǒng)中,將用于存儲(chǔ)文件數(shù)據(jù)的存儲(chǔ)空間分為多個(gè)大小相同并且順序編號(hào)的塊。所述塊 設(shè)置在順序編號(hào)的組塊中,并且每個(gè)組塊包括至少一個(gè)塊。對(duì)于一個(gè)組塊,所述方法包括下 述步驟在刪除文件中的數(shù)據(jù)的步驟之后,利用第一管理數(shù)據(jù)和第二管理數(shù)據(jù)記錄每個(gè)組 塊中的第一塊的頭部和最后塊的尾部中未被數(shù)據(jù)占據(jù)的空間大小,所述空間大小小于塊的 大小。當(dāng)從組塊的塊的中部刪除文件的某些數(shù)據(jù)時(shí),將所述塊中被刪除的數(shù)據(jù)之后的剩余 的第二半部數(shù)據(jù)移動(dòng)到緊隨塊中數(shù)據(jù)的第一半部數(shù)據(jù)之后的位置,并且將發(fā)生刪除的塊和 組塊中該塊之前的塊重組為第一新組塊,并且如果在發(fā)生刪除的塊之后還有塊,將這些之 后的塊重組為第二新組塊,利用第三管理數(shù)據(jù)和第四管理數(shù)據(jù)分別記錄第二新組塊中第一 塊的頭部和最后塊的尾部中的空閑空間的大小,并連接第一新組塊與第二新組塊。根據(jù)一個(gè)實(shí)施方式,采用刪除之前初始組塊號(hào)對(duì)第一新組塊進(jìn)行編號(hào),緊隨文件 系統(tǒng)中最初的最后組塊號(hào)對(duì)第二新組塊進(jìn)行編號(hào)。根據(jù)另外一個(gè)實(shí)施方式,將組塊之間的連接信息記錄在文件系統(tǒng)管理數(shù)據(jù)中。本發(fā)明的第四方面提供了一種文件系統(tǒng)。在所述文件系統(tǒng)中,將用于存儲(chǔ)文件數(shù) 據(jù)的存儲(chǔ)空間分為多個(gè)大小相同并且順序編號(hào)的塊。所述塊設(shè)置在順序編號(hào)的組塊中,并 且每個(gè)組塊包括至少一個(gè)塊。所述文件系統(tǒng)包括用于每個(gè)組塊的管理數(shù)據(jù),用于指示組塊 的頭部和/或尾部中空閑空間大小,其中所述空閑存儲(chǔ)空間的大小小于塊的大小。根據(jù)一個(gè)實(shí)施方式,利用第一管理數(shù)據(jù)和第二管理數(shù)據(jù)記錄組塊中的第一塊的頭 部和最后塊的尾部中的空間大小。根據(jù)另外一個(gè)實(shí)施方式,連接用于文件的全部組塊以保持文件的連續(xù)性,并且將 連接信息存儲(chǔ)在文件系統(tǒng)管理數(shù)據(jù)中。本發(fā)明的第五方面提供了 一種包括上述文件系統(tǒng)的存儲(chǔ)裝置。
圖1是傳統(tǒng)文件系統(tǒng)的示意圖;圖2是根據(jù)本發(fā)明的實(shí)施方式的文件系統(tǒng)的示意圖;圖3是根據(jù)本發(fā)明的另一實(shí)施方式的文件系統(tǒng)的示意圖;圖4是利用根據(jù)本發(fā)明實(shí)施方式的文件系統(tǒng)進(jìn)行讀出操作時(shí)計(jì)算組塊中的數(shù)據(jù) 實(shí)際大小的流程圖;圖5是根據(jù)本發(fā)明的文件系統(tǒng)的讀出操作的流程圖;圖6是利用根據(jù)本發(fā)明實(shí)施方式的文件系統(tǒng)進(jìn)行寫入操作時(shí)計(jì)算組塊中的數(shù)據(jù) 實(shí)際大小的流程圖;圖7是根據(jù)本發(fā)明的文件系統(tǒng)的寫入操作的流程圖;圖8是根據(jù)本發(fā)明的文件系統(tǒng)的數(shù)據(jù)刪除操作的流程圖;圖9是從組塊的開始切除數(shù)據(jù)的數(shù)據(jù)刪除操作的示意圖;圖10是從組塊的尾部切除數(shù)據(jù)的數(shù)據(jù)刪除操作的示意圖;圖11是從組塊的中部切除數(shù)據(jù)的數(shù)據(jù)刪除操作的流程圖;圖12是從組塊的中部切除數(shù)據(jù)的數(shù)據(jù)刪除操作的示意圖。
具體實(shí)施例方式下面對(duì)本發(fā)明的優(yōu)選實(shí)施方式進(jìn)行詳細(xì)說(shuō)明,但是這些實(shí)施方式不構(gòu)成對(duì)本發(fā)明 范圍的任何限制。在圖2所示的實(shí)施方式中,文件具有8個(gè)塊,每個(gè)塊包含8K字節(jié)的數(shù)據(jù)。在文 件管理系統(tǒng)中,屬于一個(gè)文件的塊通過(guò)組塊來(lái)管理。組塊包含一組塊(至少一個(gè)塊)。 在圖2中,組塊0包括塊0-2,組塊1包括塊10-11,組塊2包括塊12-14。雖然在本實(shí) 施方式中所有組塊中的塊的數(shù)量均不同,但在其他實(shí)施方式中數(shù)量可以相同。根據(jù)本 實(shí)施方式,采用6個(gè)描述符來(lái)描述每個(gè)組塊。所述6個(gè)描述符為StartBl0CkNumber、 TotalBlockNumber、PreviousChunkNumber、NextChunkNumber、UnusedSizeInFirstBlock 禾口 UnusedSizelnLastBlockοStartBlockNumber表示組塊的起始?jí)K號(hào),TotalBlockNumber表示組塊中塊的總 數(shù),PreviousChunkNumber表示當(dāng)前組塊之前的組塊號(hào),NextChunkNumber表示當(dāng)前組塊之 后的組塊號(hào),UnusedSizelnFirstBlock表示組塊的第一塊中未用空間量(未被數(shù)據(jù)占據(jù)的 空間的比特?cái)?shù)hUnusedSizelnLastBlock表示組塊的最后塊中未用空間量(未被數(shù)據(jù)占據(jù) 的空間的比特?cái)?shù))。采用最后兩個(gè)描述符的原因在于,在組塊被從中部刪除數(shù)據(jù)之后,最后 塊中的未用空間通常出現(xiàn)在刪除開始的塊,而第一塊中的未用空間通常出現(xiàn)在刪除結(jié)束的 塊。請(qǐng)參看圖2,將組塊 0-2 分別描述為(0,3,-1,1,0,0)、(10,2,0,2,0,0),和(12,3, 1,-1,0,0)ο第一組塊的描述符為(0,3,-1,1,0,0),其中第一描述符“O”表示當(dāng)前組塊從塊 O開始,第二描述符“3”表示當(dāng)前組塊中有3個(gè)塊,第三描述符“_1”表示當(dāng)前組塊之前組塊 為“空(NULL) ”,第四描述符“1”表示當(dāng)前組塊之后的組塊為組塊1,第五和第六描述符“O” 分別表示當(dāng)前組塊的第一塊中的未用空間為O字節(jié)和當(dāng)前組塊的最后塊中的未用空間為O字節(jié),即組塊0中全部塊都包含8K字節(jié)數(shù)據(jù)。組塊1和2中的描述符與組塊0中描述符類 似。在本實(shí)施方式中,采用“NULL”來(lái)表示當(dāng)前組塊的前一組塊或后一組塊是無(wú)效的,這意 味著當(dāng)前組塊是文件的第一組塊或者最后組塊。例如,組塊0的前一組塊的系數(shù)為“NULL”, 組塊2的后一組塊的系數(shù)為“NULL”。在圖3所示另外一個(gè)實(shí)例中,文件中有3個(gè)組塊組塊0、組塊1和組塊2,用(10, 2,_1,1,1024,2048)、(20,4,0,2,0,0)和(28,6,1, -1,0,0)分別表示這三個(gè)組塊。從三個(gè) 組塊的描述符可以看出,組塊0開始于塊10,其長(zhǎng)度是2個(gè)塊,每個(gè)塊為8K (8*1024)字節(jié), 組塊0的第一塊中未使用空間的量為IK (8*1024)字節(jié),組塊0的最后塊中未使用空間的量 為2K (8*1024)字節(jié);組塊1開始于塊20,其長(zhǎng)度是4個(gè)塊,每個(gè)塊為8K (8*1024)字節(jié),組 塊1的第一塊和最后塊中未使用空間的量為0,這表示組塊1中為滿數(shù)據(jù);組塊2開始于塊 28,其長(zhǎng)度是6個(gè)塊,每個(gè)塊為8K (8*1024)字節(jié),組塊2的第一塊和最后塊中未使用空間的 量為0。圖4和圖5說(shuō)明了根據(jù)本發(fā)明實(shí)施方式的讀出操作的詳細(xì)流程。圖4示出了計(jì)算組塊中數(shù)據(jù)大小的實(shí)際長(zhǎng)度的流程。流程開始于步驟410。在步 驟 420,計(jì)算組塊中數(shù)據(jù)的實(shí)際長(zhǎng)度 ChunkLength,ChunkLength = TotalBlockNumber^Blo ckSize-UnusedSizeInFirstBlock-UnusedSizeInLastBlock,其中 TotalBlockNumber 是當(dāng) 前組塊中塊總數(shù)。用每個(gè)塊的大小BlockSize (字節(jié))乘以TotalBlockNumber,可以獲得當(dāng) 前組塊占據(jù)的字節(jié)總數(shù),而需要從當(dāng)前組塊占據(jù)的字節(jié)總數(shù)除去UnusedSizelnLastBlock 和UnusedSizelnFirstBlock的大小,因?yàn)檫@些空間實(shí)際上是空閑的。當(dāng)在步驟430確定當(dāng) 前組塊不是文件中的最后組塊時(shí),獲得當(dāng)前組塊中數(shù)據(jù)的實(shí)際長(zhǎng)度。流程終止于步驟460。 例如,組塊 O 的 ChunkLength 為 2*8K_1K_2K = 13Kbytes。但是,如果在步驟430確定當(dāng)前組塊是文件中的最后組塊時(shí),流程前進(jìn)至步驟 440,以進(jìn)一步確定占據(jù)當(dāng)前組塊的當(dāng)前文件的數(shù)據(jù)實(shí)際長(zhǎng)度。此步驟用于排除最后組塊中 的保留空間(reserved space)。當(dāng)向文件系統(tǒng)中寫入某些數(shù)據(jù)時(shí),將分配更多空間以適應(yīng) 這些數(shù)據(jù),從而當(dāng)在當(dāng)前數(shù)據(jù)之后將另外的數(shù)據(jù)寫入相同文件時(shí)不會(huì)發(fā)生空間的再分配。 步驟440的目的是除去保留空間。在步驟440,確定ChunkLength是否大于FileLength與 ChunkStartPosition之間的差。FileLength是指示當(dāng)前文件具有多少字節(jié)數(shù)據(jù)的參數(shù), ChimkStartPosition指示當(dāng)前組塊從何處開始或者當(dāng)前組塊之前有多少字節(jié)數(shù)據(jù)。在圖3 中以組塊2為例。組塊長(zhǎng)度為6*8K = 48Κ。FileLength為(4+6+2) *8Κ_3Κ = 93Κ。組塊2的 起始位置ChunkStartPosition為2*8K+4*8K_1K_2K = 45Κ字節(jié),即存儲(chǔ)在組塊2的文件部 分從文件開始處偏移45Κ的位置開始。如果在步驟440的判斷結(jié)果為“是”,即ChunkLength 大于FileLength與ChunkStartPosition之間的差,則只讀出ChunkLength的數(shù)據(jù),而此時(shí) 并不考慮剩余的數(shù)據(jù)。圖5是示意性讀出步驟的流程圖。讀出步驟開始于步驟510。在步驟511確定數(shù)據(jù)長(zhǎng)度是否大于0,該步驟為有效性 檢驗(yàn)。如果判斷結(jié)果為“否”,表示沒(méi)有數(shù)據(jù)可以讀出。然后流程前進(jìn)至步驟512并結(jié)束。如 果存在可以讀出的數(shù)據(jù),流程前進(jìn)至步驟513以計(jì)算讀出所述文件所需的參數(shù)。在步驟513 中,首先計(jì)算出OffsetInChimk,該參數(shù)是指示讀出操作在當(dāng)前組塊中的偏移的指針。例如, 組塊中第一可用數(shù)據(jù)字節(jié)的偏移量是“0”字節(jié),組塊中第二可用數(shù)據(jù)字節(jié)的偏移量是“1”
7字節(jié),等等。OffsetInChunk = FilePosition-ChunkStartPosition。文件位置是文件中的 偏移。例如,文件中第一可用數(shù)據(jù)字節(jié)的偏移量是“0”字節(jié),文件中第二可用數(shù)據(jù)字節(jié)的偏 移量是“1”字節(jié),等等。在圖3中還以組塊0為例進(jìn)行說(shuō)明。從組塊0的第一數(shù)據(jù)字節(jié)讀 出文件。對(duì)于組塊0中數(shù)據(jù)的第一字節(jié)并且也是文件的數(shù)據(jù)的第一字節(jié),F(xiàn)ilePosition為 0,ChunkStartPosition為0,因此OffsetInChunk也是0。如果文件是從數(shù)據(jù)的第五字節(jié)讀 出,則 FilePosition 為 5 字節(jié)并且 ChunkStartPosition 為 O 字節(jié)。因此 OffsetInChunk 為 5字節(jié)。則計(jì)算出組塊1中數(shù)據(jù)的第一字節(jié)的物理位置,即ReadOffset = ChunkStartAddr essInHardDisk+OffsetlnChunk+UnusedSizelnFirstBlockοChunkStartAddressInHardDisk 是硬盤上當(dāng)前組塊的地址。因此對(duì)于組塊1,UnusedSizelnFirstBlock為IK字節(jié),并且 ReadOffset為ChunkStartAddressHardDisk加上1KB,這表示應(yīng)用程序首先找到組塊1的 物理位置,然后移動(dòng)1KB的偏移量并到達(dá)將被讀出的數(shù)據(jù)的實(shí)際位置。還要判斷從當(dāng)前組 土夬中可以讀出多少數(shù)據(jù)=AvailableSizeInChunk = ChunkLength-OffsetInChunk。對(duì)于組 塊 1,AvailableSizeInChunk 為 13K 字節(jié)。在步驟514進(jìn)一步判斷將要讀出的數(shù)據(jù)量Length_to_Read是否大于當(dāng)前組塊 中的可用數(shù)據(jù)AvailableSizelnChunk。此步驟用于判斷從當(dāng)前組塊讀出數(shù)據(jù)是否已經(jīng)足 夠。如果需要讀出更多數(shù)據(jù),即步驟514判斷結(jié)果為“是”,則需要首先讀出當(dāng)前組塊中的全 部數(shù)據(jù)。在步驟 515 設(shè)置 ReadSizeInChunk = AvailableSizelnChunk。如果步驟 514 判 斷結(jié)果為“否”,即需要讀出比當(dāng)前組塊中可用數(shù)據(jù)量少的數(shù)據(jù),則流程前進(jìn)至步驟516,將 Length_to_Read設(shè)置為ReadSizelnChunk。在步驟515和516之后,流程前進(jìn)至步驟517 以進(jìn)行讀出操作,從位置ReadOffset讀出ReadSizelnChunk數(shù)據(jù)。在讀出操作之后,流程 前進(jìn)至步驟518以更新參數(shù)Length_to_Read和FilePosition,其中Length_to_Read被更 新為 Length_to_Read-ReadSizeInChunk,因?yàn)楦鶕?jù)上述流程已經(jīng)讀出 ReadSizelnChunk 數(shù) 據(jù),并且 FilePosition = FilePosition+ReadSizelnChunk。另外,在步驟519判斷文件的數(shù)據(jù)是否已經(jīng)被完全讀出。如果判斷結(jié)果為“是”,即 更新的Length_to_Read大于0,則當(dāng)前文件的某些數(shù)據(jù)還未讀出,應(yīng)用程序前進(jìn)至下一組 塊以在步驟520和521進(jìn)行后續(xù)的讀出操作。在步驟521,ChunkStartPosition被更新為 前一 ChunkStartPosition 力口上前一 ChunkLength,艮口下一組塊的 ChunkStartPosition。如 果步驟519的判斷結(jié)果為“否”,即當(dāng)前文件的全部數(shù)據(jù)均已經(jīng)被讀出,則流程前進(jìn)至步驟 522。請(qǐng)參看圖6和圖7,其示出了示例性寫入操作。圖6和圖7中的符號(hào)/標(biāo)記/標(biāo)識(shí) 符都與圖4和圖5類似,此處不再詳細(xì)說(shuō)明。圖6是計(jì)算可以在組塊中寫入數(shù)據(jù)的自由空間量的流程圖。此流程開始于步 驟601。在步驟602,判斷當(dāng)前組塊中數(shù)據(jù)的實(shí)際長(zhǎng)度,該步驟與圖4的讀出步驟過(guò)程中 的操作類似,此處不再詳細(xì)說(shuō)明。隨后在步驟603,判斷當(dāng)前組塊是否為文件的最后組 塊。如果判斷結(jié)果為“否”,流程前進(jìn)至步驟605并結(jié)束。如果判斷結(jié)果為“是”,流程前進(jìn) 至步驟604,其中當(dāng)前組塊中可用空閑空間是步驟602獲得的值加上文件的最后組塊的值 UnusedSizeInLastBlockο圖7示出了詳細(xì)的寫入操作。所述寫入操作開始于步驟710并進(jìn)入步驟712,在該步驟判斷將寫入的數(shù)據(jù)長(zhǎng)度是否有效。如果判斷結(jié)果為“否”,流程前進(jìn)至步驟712并結(jié)束。如果判斷結(jié)果為 “是”,流程前進(jìn)至步驟713,以計(jì)算在當(dāng)前組塊寫入的位置、映射至硬盤的位置以及在當(dāng) 前組塊中能夠?qū)懭攵嗌僮止?jié)的數(shù)據(jù)。上述三個(gè)數(shù)值由OffsetlnChunk、WriteOffset和 AvailableWriteSizeInChunk表示。此處對(duì)OffsetlnChunk的計(jì)算與讀出操作過(guò)程相同。 但是,此處OffsetlnChunk用于計(jì)算寫入操作在當(dāng)前組塊中開始的位置。WriteOffset表 示寫入當(dāng)前文件的實(shí)際物理位置,其計(jì)算過(guò)程與圖4所示讀出操作過(guò)程中的ReadOffset相 似。AvailableWriteSizelnChunk顯示了在當(dāng)前組塊中可以寫入的大小,其計(jì)算與讀出操作 中的AvailableSizeInChunk相似,不同之處是利用圖6所示步驟計(jì)算ChunkLength。在步 驟714,判斷當(dāng)前組塊中是否有空間可以寫入數(shù)據(jù),即AvailableWriteSizelnChunk是否大 于0。如果判斷結(jié)果為“否”,流程前進(jìn)至步驟720以進(jìn)一步考慮利用下一組塊的可能性。如 果步驟714的判斷結(jié)果為“是”,則在步驟715判斷寫入的數(shù)據(jù)長(zhǎng)度Length_t0_Write是否 大于可以用于寫入操作的大小AvailableWriteSizelnChunk。如果步驟715的判斷結(jié)果為 “是”,即當(dāng)前組塊中可以寫入的大小不足以進(jìn)行數(shù)據(jù)寫入,因此需要更多組塊。然后流程前 進(jìn)至步驟 716,AvailableWriteSizelnChunk 大小的數(shù)據(jù)被設(shè)置在 WriteSizelnChunk,用于 步驟718的寫入操作。如果判斷結(jié)果為“否”,即當(dāng)前組塊具有足夠的空間來(lái)寫入數(shù)據(jù)。在 步驟717,將Length_to_Write設(shè)置為WriteSizelnChunk并且流程前進(jìn)至步驟718,其中從 位置 WriteOffset 寫入 WriteSizelnChunk 的 data。然后,原始FilePosition 移動(dòng)至由原始 FilePosition+ffriteSizelnChunk 所確定的位置。將要寫入的文件的剩余數(shù)據(jù)大小變?yōu)樵糒ength_t0_Write減去 WriteSizelnChunk (已經(jīng)寫入組塊)。由于根據(jù)步驟715的判斷結(jié)果后續(xù)寫入操作有可能需要更多組塊,則在步驟 720判斷是否仍需要寫入某些數(shù)據(jù)。如果該步驟的判斷結(jié)果為“是”,則移動(dòng)至下一組 塊以進(jìn)行寫入操作,如步驟721和722所示。在步驟724,UnusedSizelnFirstBlock和 UnusedSizelnLastBlock被初始化為O并移動(dòng)至下一組塊。將寫入操作開始的位置的指針 修改為 ChunkStartPosition = ChunkStartPosition+ChunkLength。從文件系統(tǒng)中刪除數(shù)據(jù)也是重要的流程。該流程示于圖8至圖11中。圖8示出了示例性刪除操作的流程圖。此流程開始于步驟801。在步驟802,進(jìn)行判 斷以找到刪除開始的位置。該步驟為有效性檢驗(yàn)。其后,判斷將被刪除的數(shù)據(jù)長(zhǎng)度是否為有 效值(步驟803)。如果判斷結(jié)果為“否”,流程前進(jìn)至步驟805并結(jié)束。如果判斷結(jié)果為“是”, 在步驟804確定刪除開始的位置OffsetlnChunk以及從當(dāng)前組塊中刪除的數(shù)據(jù)的長(zhǎng)度。利 用公式 Off setlnChunk = Fi lePosition-ChunkStartPosition 來(lái)計(jì)算 OffsetlnChunk,利用 ^ J^AvailableDeleteSize = ChunkLength—Offset InChunk 來(lái)計(jì)算 Avai lab IeDe IeteSize0 然后流程前進(jìn)至步驟806,判斷將刪除的數(shù)據(jù)長(zhǎng)度Length_t0_Delete是否大于當(dāng)前組塊中 可用數(shù)據(jù)的大小。如果步驟806的判斷結(jié)果為“否”,表示當(dāng)前組塊中具有足夠數(shù)據(jù)可供刪 除。則流程前進(jìn)至步驟813-816以執(zhí)行刪除操作。在步驟813,判斷OffsetlnChunk是否等于0。此步驟用于確定刪除操作是否從 組塊數(shù)據(jù)的第一字節(jié)開始。如果判斷結(jié)果為“否”,即當(dāng)前組塊的刪除操作從組塊的中部開 始,則流程前進(jìn)至步驟815,從由OffsetlnChunk指示的位置開始刪除當(dāng)前組塊的數(shù)據(jù)。同 時(shí),由于步驟806的判斷結(jié)果為“否”,因此相對(duì)于需要?jiǎng)h除的數(shù)據(jù)長(zhǎng)度而言當(dāng)前組塊中有更多的可用數(shù)據(jù),因此在當(dāng)前組塊中應(yīng)該留有某些數(shù)據(jù)。在這種情況下,在步驟815只刪 除當(dāng)前組塊的中部,并且流程結(jié)束于步驟816。如果步驟813的判斷結(jié)果為“是”,即刪除 操作從當(dāng)前組塊的頭部開始。由于步驟806的判斷結(jié)果為“否”,相對(duì)于將刪除的數(shù)據(jù)而言 具有更多可用數(shù)據(jù),則在步驟814刪除當(dāng)前組塊的頭部。當(dāng)從當(dāng)前組塊的頭部開始進(jìn)行刪 除操作時(shí),剩余塊中的第一塊的頭部可能被部分刪除。則該塊變成了部分填充的塊,換言 之其未對(duì)齊(aligned)。采用新的UnusedSizelnFirstBlock描述當(dāng)前組塊的剩余第一塊 的未用頭部。采用下述公式計(jì)算新的 UnusedSizelnFirstBlock :UnusedSizeInFirstBlock =(Length_to_Delete+UnusedSizeInFirstBlock) % BlockSize0 (Length_to_ Delete+UnusedSizelnFirstBlock)表示將釋放的區(qū)域長(zhǎng)度?!?% ”運(yùn)算對(duì)應(yīng)于獲得除法的 補(bǔ)數(shù)(arithmetical complement)。如果補(bǔ)數(shù)不為零,表示在刪除之后剩余組塊的第一塊的 頭部中還有未被數(shù)據(jù)占據(jù)的空間。圖9示出了一個(gè)實(shí)施例。在圖9中,當(dāng)前組塊中有5個(gè)塊,即塊1-5。在塊1的頭部有3K字節(jié)的未用空 間,在塊5的尾部有2K的未用空間。S卩,當(dāng)前組塊的UnusedSizelnFirstBlock為3K字 節(jié),當(dāng)前組塊的UnusedSizelnLastBlock為2K字節(jié)。刪除從塊1的第一數(shù)據(jù)開始,將刪 除18K字節(jié)的數(shù)據(jù)。因此Length_t0_Delete為18K字節(jié)。在刪除之后,塊1-2將被釋 放,因?yàn)樗鼈儽煌耆珓h除。刪除之后的組塊的UnusedSizelnLastBlock將與刪除之前原 組塊的 UnusedSizelnLastBlock 相同,UnusedSizelnFirstBlock 將變?yōu)?Length_to_ Delete+UnusedSizelnFirstBlock) % BlockSize = (18+3) % 8 = 5K 字節(jié)。如果步驟806的判斷結(jié)果為“是”,刪除整個(gè)當(dāng)前組塊也不夠。在這種情況 下,流程前進(jìn)至步驟807,判斷對(duì)當(dāng)前組塊的刪除將從頭部還是中部開始。如果該判 斷結(jié)果為“否”,刪除操作從中部的某個(gè)位置開始進(jìn)行,流程前進(jìn)至步驟808,以從位置 OffsetInChunk開始刪除組塊中的空間。因?yàn)椴襟E806的判斷結(jié)果為“是”,表示應(yīng)當(dāng) 刪除從OfTsetInChimk開始的數(shù)據(jù),而組塊頭部的某些數(shù)據(jù)仍然存在,如果當(dāng)前組塊的 UnusedSizelnFirstBlock和數(shù)據(jù)的大小OffsetInChunk的總數(shù)不構(gòu)成完整塊(滿8K字 節(jié)),在當(dāng)前組塊的尾部將存在某些未用空間,因此在步驟808,利用下面的公式計(jì)算當(dāng)前 組塊的新 UnusedSizelnLastBlock :UnusedSiζeInLastBlock = BlockSize- (OffsetlnChun k+UnusedSizelnFirstBlock) % BlockSize。此處,“OffsetlnChunk+UnusedSizelnFirstBlo ck”表示某些數(shù)據(jù)仍然存在于組塊中?!埃?”運(yùn)算獲得除法的補(bǔ)數(shù)。在“% ”運(yùn)算之后,獲得 新的最后塊中剩余數(shù)據(jù)量。從BlockSize中減去剩余數(shù)據(jù)量以獲得最后塊中的未用大小。 圖10是說(shuō)明該流程的實(shí)施例。在圖10中,當(dāng)前組塊有5個(gè)塊,即塊1-5。在塊1的頭部有5K字節(jié)的未用空間, 在塊5的尾部有2K的未用空間。S卩,當(dāng)前組塊的UnusedSizelnFirstBlock為5K字節(jié), 當(dāng)前組塊的UnusedSizelnLastBlock為3K字節(jié)。刪除操作從塊3中6K字節(jié)開始,將刪 除15K字節(jié)的數(shù)據(jù)。OffsetInChimk為17K字節(jié)。在刪除之后,釋放塊4_5,當(dāng)前組塊的 UnusedSizelnFirstBlock 將不變,因此將有新 UnusedSizelnLastBlock 值。該新值為 Blo ckSize-(OffsetInChunk+UnusedSizeInFirstBlock) % BlockSize = 8K_((17+5) % 8)Κ = 8Κ-6Κ = 2Κ 字節(jié)。但是,如果步驟807的判斷結(jié)果為“是”,則刪除操作從當(dāng)前組塊的頭部開始。因?yàn)?步驟806的判斷結(jié)果對(duì)于步驟807為“是”,在步驟809刪除整個(gè)組塊。在此操作之后流程
10前進(jìn)至下一組塊并返回步驟803。如果圖8所示刪除是刪除了組塊的中部,即在步驟815處理,組塊被分為兩個(gè)組 塊。圖11示出了處理這種情況的操作。流程開始于步驟1111。在步驟1112,通過(guò)公式Offset =OffsetlnChunk+UnusedSizelnChunk 計(jì)算描述符 “Offset”。隨后在步驟 1113 判斷是 否在組塊中的相同塊上進(jìn)行了刪除,即刪除組塊的中部。判斷方法是判斷是否(Offset/ BlockSize) = (Offset+Length_to_Delete)/BlockSize。此處“/”是獲得結(jié)果的整數(shù)部分 的運(yùn)算。如果步驟1113的判斷結(jié)果為“否”,表示從當(dāng)前組塊的中部刪除了組塊的某些整塊 并且當(dāng)前組塊被分為兩個(gè)組塊。如果步驟1113的判斷結(jié)果為“是”,表示從塊的中部進(jìn)行刪 除操作。流程前進(jìn)至步驟1114,拷貝塊的后部以重寫被刪除的內(nèi)容,將Offset的數(shù)值更新 為 Offset 的原始值加上(BlockSize-(Offset+Length_to_Delete) % BlockSize)。在步驟 1115的處理之后,在步驟1116和1117更新某些標(biāo)識(shí)符的數(shù)值。在步驟1116和1117將設(shè)置新組塊的描述符并改變?cè)M塊的描述符。下面將參照?qǐng)D12進(jìn)一步說(shuō)明步驟1116和1117的過(guò)程。在圖12中,當(dāng)前組 土夬(例如組塊5)具有6個(gè)塊,StartBlockNumer為塊10,TotalBlockNumber為6個(gè)塊, PreviousChunkNumber 為組塊 4, NextChunkNumber 為組塊 6, UnusedSizeInFirstBlock 為 3K 字節(jié),UnusedSizelnLastBlock 為 4K 字節(jié)。在進(jìn)行刪除操作時(shí),OffsetInChunk為 15K 字節(jié),Length_to_Delete 為 2IK 字 節(jié),即從15K字節(jié)之后的位置開始刪除21K字節(jié)數(shù)據(jù)。因此Offset為OffsetInChunk+Un usedSizelnFirstBlock = 15K+3K = 18K 字節(jié)。根據(jù)步驟 1113,因?yàn)?Offset/Block)= (18K/8K) Φ ((Offset) +Length_to_Delete) = ((18K+21K)/8K),刪除未發(fā)生在單一組塊 中。在刪除操作之后,原組塊5將變?yōu)樾陆M塊5和另一組塊(如果在原始文件系統(tǒng)中有7個(gè) 組塊,則為組塊8)。對(duì)于新組塊5,StartBlockNumer未變。由于在步驟1116中(Offset% BlockSize) = (18K % 8K) = 2 乒 0,新組塊 5 的 TotalBlockNumber 將等于((Offset/ BlockSize)+l),即變?yōu)?個(gè)塊。新組塊5的PreviousChunkNumber與原組塊5的相同。 NextChunkNumber變?yōu)榻M塊8。新組塊5的UnusedSizelnFirstBlock與原組塊5的相同。 新組塊 5 的 UnusedSizelnLastBlock 為 BlockSize-(Offset% BlockSize) = 8K-(18% 8) K = 8Κ-2Κ = 6Κ 字節(jié)。對(duì)于新組塊 8,StartBlockNumer 為新組塊 5 的 StartBlockNumber 力口 上 (Offset+Length_to_Delete)/BlockSize,等于 10+(18K+21K)/8K = 10+4 = 14,即為塊 14。 TotalBlockNumber 為新組塊 5 的 TotelBlockNumber 減去(Offset+Length_to_Delete)/ BlockSize,等于6-4 = 2,即新組塊8中有2個(gè)塊。組塊8的PreviousChunkNumber為組 塊 5,NextChunkNumber 為組塊 6。組塊 8 的 UnusedSizelnFirstBlock 為(Offset+Length_ to_Delete) % BlockSize = (18+21) % 8 = 7K 字節(jié),UnusedSizelnLastBlock 與原組塊 5 具有相同大小,即4K字節(jié)。塊13被從文件系統(tǒng)中完全刪除,因此其空間被釋放。上述的文件系統(tǒng)可以是機(jī)頂盒(Set Top Box)和其他裝置中的PVR文件系統(tǒng)。上面說(shuō)明了本發(fā)明的幾個(gè)實(shí)施方式??梢岳斫?,對(duì)上述實(shí)施方式可以進(jìn)行各種修 改。另外,本領(lǐng)域普通技術(shù)人員可以理解,對(duì)于說(shuō)明書中說(shuō)明的結(jié)構(gòu)和方法,可以使用具有 實(shí)質(zhì)上相同的功能、采用實(shí)質(zhì)上相同的方式并獲得實(shí)質(zhì)上相同的效果的其他結(jié)構(gòu)和方法來(lái) 替代進(jìn)行實(shí)施。因此,本說(shuō)明書所述實(shí)施方式以及上述相同的實(shí)施方式都屬于權(quán)利要求所
11限定的保護(hù)范圍。
權(quán)利要求
一種用于管理文件系統(tǒng)中的文件數(shù)據(jù)的方法,其中將用于存儲(chǔ)文件數(shù)據(jù)的存儲(chǔ)空間分為多個(gè)大小相同并且順序編號(hào)的塊,其特征在于,所述塊設(shè)置在順序編號(hào)的組塊中,并且每個(gè)組塊包括至少一個(gè)塊,對(duì)于一個(gè)組塊,所述方法包括下述步驟在刪除文件中的數(shù)據(jù)的步驟之后,利用第一管理數(shù)據(jù)和第二管理數(shù)據(jù)記錄每個(gè)組塊中的第一塊的頭部和最后塊的尾部中未被數(shù)據(jù)占據(jù)的空間大小,所述空間大小小于塊的大小。
2.根據(jù)權(quán)利要求1所述的方法,其中所述刪除步驟包括從所述組塊的頭部或者尾部刪 除數(shù)據(jù)。
3.根據(jù)權(quán)利要求1或2所述的方法,其中連接包含給定文件的數(shù)據(jù)的組塊,并且將連接 信息記錄在文件系統(tǒng)管理數(shù)據(jù)中。
4.根據(jù)權(quán)利要求1至3其中任一所述的方法,其中如果一個(gè)組塊被完全刪除,釋放用于 所述刪除的組塊的存儲(chǔ)空間并連接被刪除的組塊的前面和后面的組塊。
5.根據(jù)權(quán)利要求1所述的方法,還包括下述步驟當(dāng)文件部分被刪除并且刪除起始位置和結(jié)束位置沒(méi)有位于相同的塊中但是位于相同 的組塊中時(shí),所述組塊被分為第一新組塊和第二新組塊;采用第三管理數(shù)據(jù)和第四管理數(shù)據(jù)分別記錄第二新組塊的第一塊的頭部以及最后塊 的尾部中的空閑空間;并且連接第一新組塊和第二新組塊以保持文件的連續(xù)性。
6.根據(jù)權(quán)利要求5所述的方法,其中采用刪除之前原組塊號(hào)對(duì)第一新組塊進(jìn)行編號(hào), 緊隨文件系統(tǒng)中最初的最后組塊號(hào)對(duì)第二新組塊進(jìn)行編號(hào)。
7.根據(jù)權(quán)利要求5或6所述的方法,其中如果一個(gè)組塊被完全刪除,釋放該塊的空間。
8.根據(jù)權(quán)利要求1所述的方法,還包括下述步驟當(dāng)從組塊的塊的中部刪除某些數(shù)據(jù)時(shí),將所述塊中被刪除的數(shù)據(jù)之后的剩余的第二半部數(shù)據(jù)移動(dòng)到緊隨塊中數(shù)據(jù)的第一半 部數(shù)據(jù)之后的位置,將發(fā)生刪除的塊和組塊中該塊之前的塊重組為第一新組塊,并且如果在發(fā)生刪除的塊 之后還有塊,將這些之后的塊重組為第二新組塊,利用第三管理數(shù)據(jù)和第四管理數(shù)據(jù)以分別記錄第二新組塊中第一塊的頭部和最后塊 的尾部中的空閑空間的大小,并且連接第一新組塊與第二新組塊。
9.根據(jù)權(quán)利要求8所述的方法,其中采用刪除之前初始組塊號(hào)對(duì)第一新組塊進(jìn)行編 號(hào),緊隨文件系統(tǒng)中最初的最后組塊號(hào)對(duì)第二新組塊進(jìn)行編號(hào)。
10.根據(jù)權(quán)利要求8或9所述的方法,其中將組塊之間的連接信息記錄在文件系統(tǒng)管理 數(shù)據(jù)中。
11.一種文件系統(tǒng),其中將用于存儲(chǔ)文件數(shù)據(jù)的存儲(chǔ)空間分為多個(gè)大小相同并且順序 編號(hào)的塊,其特征在于,所述塊設(shè)置在順序編號(hào)的組塊中,并且每個(gè)組塊包括至少一個(gè)塊, 所述文件系統(tǒng)包括用于每個(gè)組塊的管理數(shù)據(jù),用于指示組塊的頭部和/或尾部中空閑存儲(chǔ) 空間的大小,其中所述空閑存儲(chǔ)空間的大小小于塊的大小。
12.根據(jù)權(quán)利要求11所述的文件系統(tǒng),其中利用第一管理數(shù)據(jù)和第二管理數(shù)據(jù)記錄組塊中的第一塊的頭部和最后塊的尾部中的空間大小。
13.根據(jù)權(quán)利要求12所述的文件系統(tǒng),其中連接用于文件的全部組塊以保持文件的連 續(xù)性,并且將連接信息存儲(chǔ)在文件系統(tǒng)管理數(shù)據(jù)中。
14.一種包括權(quán)利要求11-13中任一所述文件系統(tǒng)的存儲(chǔ)裝置。
全文摘要
本發(fā)明提供了用于管理和編輯文件系統(tǒng)中文件的方法和裝置。在管理文件系統(tǒng)中的文件數(shù)據(jù)的方法中,將用于存儲(chǔ)文件數(shù)據(jù)的存儲(chǔ)空間分為多個(gè)大小相同并且順序編號(hào)的塊。所述塊設(shè)置在順序編號(hào)的組塊中,并且每個(gè)組塊包括至少一個(gè)塊。對(duì)于一個(gè)組塊,所述方法包括下述步驟在刪除文件中的數(shù)據(jù)的步驟之后,利用第一管理數(shù)據(jù)和第二管理數(shù)據(jù)記錄每個(gè)組塊中的第一塊的頭部和最后塊的尾部中未被數(shù)據(jù)占據(jù)的空間大小,所述空間大小小于塊的大小。
文檔編號(hào)G11B27/034GK101911198SQ200880122672
公開日2010年12月8日 申請(qǐng)日期2008年11月19日 優(yōu)先權(quán)日2007年12月27日
發(fā)明者張曉龍, 胡建強(qiáng) 申請(qǐng)人:湯姆遜許可公司