0

私は C で独自の仮想ファイル システムを構築しています。

ここで、ギャップを探してそれらを閉じる、ある種のデフラグ方法を実装したいと考えています。

したがって、ファイル 1 がサイズ 10 で位置 X にあり、ファイル 2 がサイズ 20 で位置 Z にある場合、位置 Y に移動したいと考えています。

私の考えは、ファイル 2 のサイズを取得し、ファイル 1 のサイズからそれを差し引き、結果を使用してファイル 2 を結果と同じくらい左にシフトすることです。

実用的なソリューションを思い付くことができないため、疑似コードがあります。

for (int i = 0; i < files; i++) 
     //look for inconsistencies/gaps. 

if (found gaps)
    file 2 - file 1 = x;
    shiftfiletotheleft x bytes;

事前にアイデアと回答をありがとう。

4

1 に答える 1

0

n番目のブロックをdisk[n]参照し、残りのすべてのブロックの疑似ファイルを含むすべてのファイル (より正確には、それらが占有するブロック) のセットであると仮定すると、単純な断片化はかなり単純です。files

i = 0
for file in files:
  for blocknum in file:
    // Swap content
    buf = disk[i]
    disk[i] = disk[blocknum]
    disk[blocknum] = buf

    // Swap metadata
    swap_block(file, blocknum, i)
    file += i
    changed_file = find_file_by_block(blocknum)
    swap_block(changed_file, i, blocknum)

    i += 1

さまざまな最適化が可能であり、優れたユーザー エクスペリエンスのために必要であることに注意してください。たとえば、とにかくブロック番号でファイルを検索する必要があるため、現在検査されている ( i番目の) ブロックが属するファイルを常に選択することで、既に最適化されたファイルシステムが並べ替えられるのを防ぐことができます。blocknumさらに、もちろん、スワップするファイルが空の場合は内容を実際にコピーせず、とiが同一の場合はスワップ アクションを完全にスキップすることで、スワップを簡素化できます。

ただし、その疑似コードが C コードにどのように変換されるかは、実装によって異なります。

于 2013-10-15T16:55:20.873 に答える