現在のプロジェクトで車輪を再発明していないことを確認したいと思います。ファイルをカタログ化する CAD プログラムのコンテンツのカタログを作成するツールを作成しています。
私Catalogのクラスは、ファイルとフォルダーの階層構造を表しています。カタログ内のファイルには、実際のファイルを変更してはならない追加のメタ データが保存されている場合があります。このメタ データには、サムネイルや添付ファイルなどの他のファイルを含めることもできます。カタログは、典型的な CRUD インタラクションのインターフェイスを提供し、ファイル (およびそのメタデータ) をカタログ間でコピーできるようにする必要があります。
カタログへのインターフェースを、ほとんどどこにでも保存できるように抽象化しようとしています。たとえば、現在、ファイル システムに保存されるカタログのフォーマットを作成しています。サムネイルや添付ファイルなどのメタデータ ファイルは、カタログ フォルダー内のサイドカー ファイルに格納され、残りのカタログ データは、カタログ フォルダーのルートにある XML ファイルに格納されます。ただし、SQL Server、HTTP サーバー、ZIP ファイル、バイナリ ファイルなどに格納されるバージョンを作成できるように Catalog クラスを抽象化しようとしています。
したがって、ディスク パスでファイルを参照するのではなく、バイナリ データの最も抽象的な表現として System.IO.Stream を使用しています。最終的には、ユーザーが任意の形式のカタログ間でファイルを移動できるドラッグ アンド ドロップ インターフェイスを作成できるようにしたいと考えています。カタログ間でファイルを移動するには、関連するメタデータ ファイルも移動する必要があるため、これはかなり複雑になります。そのため、要求されたファイル IO アクションのすべてが完了するか、まったく完了しないかを保証するトランザクション システムを見つけようとしています。
参考までに、私の ICatlog インターフェイスを以下に示します。うまくいけば、それが私が達成しようとしていることのより良いアイデアを提供するでしょう. とにかく今、車輪を再発明しているのか、それとも同様の機能を提供する既存のツールやライブラリがあるのか 疑問に思っています.
interface ICatalog
{
string Location { get; }
string Name { get; set; }
//NOTE: File is not System.IO.File, but a custom class
System.Collections.Generic.IEnumerable<File> GetFiles();
System.Collections.Generic.IEnumerable<File> GetFiles(string relativeFolderPath, bool recursiveSearch);
ITransaction ImportNewFile(File f, System.IO.Stream sourceDataStream);
ITransaction CopyFileTo(File f, string destRelativePath);
ITransaction DeleteFile(string relativePath);
ITransaction MoveFile(File f, string destRelativePath);
event EventHandler<Catalog.FileAddedEventArgs> FileAdded;
event EventHandler<Catalog.FileRemovedEventArgs> FileRemoved;
System.Collections.Generic.IEnumerable<string> Folders { get; }
ITransaction AddFolder(string relativePath);
ITransaction DeleteFolder(string relativePath);
event EventHandler<Catalog.FolderAddedEventArgs> FolderAdded;
event EventHandler<Catalog.FolderRemovedEventArgs> FolderRemoved;
void WriteMetaDataFile(File file, string relPath, System.IO.Stream dataStream, bool overwrite);
System.IO.Stream ReadMetaDataFile(File file, string relPath);
ITransaction DeleteMetaDataFile(File file, string relPath);
System.Collections.Generic.IList<ICleanUpTransaction> GetCleanUpTransactions(ProgressUpdateDelegate callbackDelegate);
void RefreshFilesStatus(ProgressUpdateDelegate callbackDelegate);
void SaveAndClose(ProgressUpdateDelegate callbackDelegate);
}