I'm writing an application that creates a "Catalog" of files, which can be attributed with other meta data files such as attachments and thumbnails.
I'm trying to abstract the interface to a catalog to the point where a consumer of a catalog does not need to know about the underlying file system used to store the files. So I've created an interface called IFileSystemAdaptor
which is shown below.
public interface IFileSystemAdaptor:IDisposable
{
void WriteFileData(string fileName, Stream data);
Stream ReadFileData(string filename);
void DeleteFileData(string filename);
void ClearAllData();
void WriteMetaFileData(string filename, string path, Stream data);
Stream ReadMetaFileData(string filename, string path);
void DeleteMetaFileData(string filename, string path);
void ClearMetaFilesData(string filename);
}
Essentially my IFileSystemAdaptor interface exposes a flat list of files, that can also be associated with additional meta data files.
As you can see I'm using references to generic Stream
objects to abstract the interface to a file's data. This way one implementation of a Catalog could return files from a hard disk, while another could return the data from a web server.
Now I'm trying to figure out how to keep my program from leaving streams open. Is there a rule of thumb for what members should close streams? Should the consumer of a stream close it, or should the member that original created the stream be responsible for closing it.