Я хотел бы убедиться, что я не изобретаю колесо с моим текущим проектом. Я пишу инструмент, который создает каталог контента для CAD-программы, которая каталогизирует файлы.Есть ли существующие библиотеки библиотек файлов?
Класс Catalog
представляет собой иерархическую структуру файлов и папок. Файлы в каталоге могут содержать дополнительные метаданные, которые не должны изменять фактический файл. Эти метаданные могут также включать другие файлы, такие как миниатюры или вложения. Каталоги предоставляют интерфейс для типичных взаимодействий CRUD, а также позволяют создавать файлы (вместе со своими метаданными) для копирования между каталогами.
Я пытаюсь отвлечь интерфейс от каталога до того места, где его можно было хранить практически в любом месте. Например, сейчас я создаю формат каталога, который хранится в файловой системе. Файлы метаданных, такие как миниатюры и вложения, хранятся в файлах sidecar в папке каталога, а остальные данные каталога хранятся в файле 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);
}
Несколько вещей, которые выпрыгивают на меня: 1) используя «Файл», где я могу использовать «CatalogItem» (возможно, я слишком семантичен) и 2) I подумайте, что вы должны разбить это на ICкаталог для функций метаданных и ICatalogItem для определенных файлов. Это позволит вам реализовать различные части функциональности по-разному. – overslacked