Я бы хотел убедиться, что я не изобретаю колесо с моим текущим проектом.Я пишу инструмент, который создает каталог контента для программы CAD, которая каталогизирует файлы.
Мой класс Catalog
представляет иерархическую структуру файлов и папок.Файлы в каталоге могут содержать дополнительные метаданные, которые не должны изменять сам файл.Эти метаданные могут также включать другие файлы, такие как миниатюры или вложения.Каталоги предоставляют интерфейс для типичных взаимодействий CRUD, а также должны позволять файлам (вместе с их метаданными) делать ставки, скопированные между каталогами.
Я пытаюсь абстрагировать интерфейс к каталогу до такой степени, чтобыэто могло быть сохранено почти где угодно.Например, сейчас я создаю формат каталога, который хранится в файловой системе.Файлы метаданных, такие как миниатюры и вложения, хранятся в дополнительных файлах в папке каталога, а остальные данные каталога хранятся в файле XML в корне папки каталога.Однако я пытаюсь абстрагировать класс Catalog до такой степени, чтобы я мог создавать версии, которые хранятся в SQL Server, HTTP-сервере, ZIP-файле, двоичном файле и т. Д. И т. Д.
Таким образом, а нессылаясь на файлы по пути к диску, я использую System.IO.Stream как наиболее абстрактное представление двоичных данных.В конечном итоге я хочу иметь возможность создавать интерфейс перетаскивания, где пользователи могут перемещать файлы между каталогами любого формата.Это становится довольно сложным, поскольку перемещение файла между каталогами также требует перемещения связанных файлов метаданных.Поэтому я также пытаюсь выяснить систему транзакций, которая обеспечит выполнение всех или ни одного из запрошенных действий File IO.
Мой интерфейс ICatalog показан ниже для справки.Надеюсь, это даст мне лучшее представление о том, чего я пытаюсь достичь.Так или иначе, теперь мне интересно, изобретаю ли я колесо заново, или существуют ли какие-либо существующие инструменты или библиотеки, обеспечивающие аналогичную функциональность.
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);
}