2

私はファイル管理Windowsアプリケーションを開発しています。プログラムは、ディスク上にあるすべてのファイルとフォルダへのパスの配列を保持する必要があります。例えば:

0 "C:"  
1 "C:\abc"  
2 "C:\abc\def"  
3 "C:\ghi"  
4 "C:\ghi\readme.txt"  

アレイは「現状のまま」非常に大きくなるため、圧縮してディスクに保存する必要があります。ただし、ランダムアクセスが必要です。

  1. インデックス(例RetrievePath(2) = "C:\abc\def") で配列内の任意のパスを取得するには
  2. 配列内の任意のパスのインデックスを検索するには(例IndexOf("C:\ghi") = 3:)
  3. 配列に新しいパスを追加するには(既存のパスのインデックスは変更しないでください)、たとえば、AddPath("C:\ghi\xyz\file.dat")
  4. データベース内のファイルまたはフォルダの名前を変更します。
  5. 既存のパスを削除します(ここでも、他のインデックスは変更しないでください)。
    たとえば1 "C:\abc"、データベースからパスを削除しても、は4 "C:\ghi\readme.txt"

誰かがこれらのことを行うためのいくつかの良いアルゴリズム/データ構造/アイデアを提案できますか?

編集:
現時点で私は次の解決策を思いついた:

0 "C:"
1 "[0]\abc"
2 "[1]\def"
3 "[0]\ghi"
4 "[3]\readme.txt"

つまり、一般的なプレフィックスが圧縮されます。

  1. RetrievePath(2) = "[1]\def" = RetrievePath(1) + "\def" = "[0]\abc\def" = RetrievePath(0) + "\abc\def" = "C:\abc\def"
  2. IndexOf()また、次のように繰り返し動作します。

    IndexOf("C:") = 0
    IndexOf("C:\abc") = IndexOf("[0]\abc") = 1
    IndexOf("C:\abc\def") = IndexOf("[1]\def") = 2
    
  3. たとえば、新しいパスを追加するにはAddPath("C:\ghi\xyz\file.dat")、最初にそのプレフィックスを追加する必要があります。

    5 [3]\xyz
    6 [5]\file.dat
    
  4. ファイル/フォルダの名前の変更/移動には、1回の置換のみが含まれます(たとえば、に置き換える[0]\ghiと、ディレクトリの[1]\klm名前が変更され、ディレクトリ"ghi""klm"移動されます"C:\abc"

  5. DeletePath()には、それ(およびすべてのサブパス)を空の文字列に設定することが含まれます。将来的には、新しいパスに置き換えることができます。
    の後DeletePath("C:\abc")、配列は次のようになります。

    0 "C:"
    1 ""
    2 ""
    3 "[0]\ghi"
    4 "[3]\readme.txt"
    

高速操作を実行するには、アレイ全体をRAMにロードする必要があります。たとえば、ファイルとフォルダの合計が1000000で、ファイル名の平均長が10の場合、アレイは10MB以上を占有します。
また、関数IndexOf()は配列を順番にスキャンするように強制されます。

編集(2):質問を再定式化できることに気づきました:
ディスク上の各ファイルと各フォルダーに一意の整数インデックスを割り当てて、既知のファイルのインデックスであるインデックスごとにファイル/フォルダーをすばやく見つけることができるようにする方法/ folder、そして多くのインデックスを変更せずに基本的なファイル操作を実行しますか?

編集(3): これは類似しているがLinux関連の問題についての質問です。ファイル名とコンテンツハッシュを使用してファイルを識別することをお勧めします。Windows固有の改善点はありますか?

4

1 に答える 1

0

あなたの解決策はまともなようです。また、「\」、ドライブ文字、一般的なファイル拡張子などの一般的な文字にのみ数ビットを使用するなど、アドホックなトリックを使用してさらに圧縮を試みることもできます。試行を確認することもできます(http://en.wikipedia.org/wiki/Trie)。

2回目の編集に関しては、これはハッシュテーブルの機能と一致しているようですが、これはインデックス作成用であり、圧縮ストレージ用ではありません。

于 2012-08-30T13:04:45.063 に答える