我想确保我不会在我当前的项目中重新发明轮子。我正在编写一个为 CAD 程序创建内容目录的工具,该程序对文件进行编目。
我的Catalog
类代表文件和文件夹的层次结构。目录中的文件可以存储其他元数据,这些元数据不应修改实际文件。此元数据还可以包括其他文件,例如缩略图或附件。目录为典型的 CRUD 交互提供了一个接口,并且还应该允许文件(连同它们的元数据)在目录之间进行复制。
我正在尝试将接口抽象为目录,使其几乎可以存储在任何地方。例如,现在我正在创建一种存储在文件系统上的目录格式。缩略图和附件等元数据文件存储在目录文件夹内的边车文件中,其余目录数据存储在目录文件夹根目录的 XML 文件中。但是,我正在尝试将 Catalog 类抽象到可以创建存储在 SQL Server、HTTP 服务器、ZIP 文件、二进制文件等中的版本的程度。
因此,我使用 System.IO.Stream 作为二进制数据的最抽象表示,而不是通过磁盘路径引用文件。最终,我希望能够创建一个拖放界面,用户可以在其中在任何格式的目录之间移动文件。这变得相当复杂,因为在目录之间移动文件还需要移动相关的元数据文件。因此,我还试图找出一个事务系统,以确保所有或没有请求的文件 IO 操作完成。
我的 IDatalog 界面如下所示,以供参考。希望它能更好地了解我正在努力完成的工作。所以无论如何,现在我想知道我是否在重新发明轮子,或者是否有任何现有的工具或库提供类似的功能。
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);
}