【发布时间】:2012-11-30 18:22:33
【问题描述】:
这个问题的背景是基于我正在开发的虚拟文件系统。我使用的概念是不同类型存储类型的虚拟路径提供程序,即本地文件系统、保管箱和亚马逊 s3。我的虚拟文件基类如下所示:
public abstract class CommonVirtualFile : VirtualFile {
public virtual string Url {
get { throw new NotImplementedException(); }
}
public virtual string LocalPath {
get { throw new NotImplementedException(); }
}
public override Stream Open() {
throw new NotImplementedException();
}
public virtual Stream Open(FileMode fileMode) {
throw new NotImplementedException();
}
protected CommonVirtualFile(string virtualPath) : base(virtualPath) { }
}
第二个 Open 方法的实现是我的问题所在。如果我们查看我的本地文件系统实现,即在磁盘上保存文件,它看起来像这样:
public override Stream Open(FileMode fileMode) {
return new FileStream("The_Path_To_The_File_On_Disk"), fileMode);
}
如果我想在本地文件系统上保存一个文件,它看起来像这样:
const string virtualPath = "/assets/newFile.txt";
var file = HostingEnvironment.VirtualPathProvider.GetFile(virtualPath) as CommonVirtualFile;
if (file == null) {
var virtualDir = VirtualPathUtility.GetDirectory(virtualPath);
var directory = HostingEnvironment.VirtualPathProvider.GetDirectory(virtualDir) as CommonVirtualDirectory;
file = directory.CreateFile(VirtualPathUtility.GetFileName(virtualPath));
}
byte[] fileContent;
using (var fileStream = new FileStream(@"c:\temp\fileToCopy.txt", FileMode.Open, FileAccess.Read)) {
fileContent = new byte[fileStream.Length];
fileStream.Read(fileContent, 0, fileContent.Length);
}
// write the content to the local file system
using (Stream stream = file.Open(FileMode.Create)) {
stream.Write(fileContent, 0, fileContent.Length);
}
我想要的是,如果我切换到我的 amazon s3 虚拟路径提供程序,我希望这段代码可以直接工作而无需任何更改,所以总结一下,我如何使用 amazon s3 sdk 解决这个问题以及我应该如何实现我的我的 amazon s3 虚拟路径提供程序中的 Open(FileMode fileMode) 方法?
【问题讨论】:
-
你应该使用SDK。
-
@AaronMcIver 抱歉,我的问题很模糊。我添加了更多信息
-
你想做什么?你能在这里写下你的用例吗?
-
我认为您需要做的是进行接口/工厂设计,以适应各种云存储提供商 SDK 实现。请检查您没有侵犯他们的任何专利,例如David Ebbo's Microsoft Patents - 您尝试做的事情听起来像是一项非常酷的技术开发!祝你好运!!