很长一段时间以来,我一直在寻找.NET中的一个类,它具有使得操作系统认为在特定位置存在文件(或目录,或两者等)的功能 - 但所有钩子都是传递给代码中的函数(或事件?).
例:
如果我浏览到"x:\ fake_directory \",我会在那里看到一个文件,"fake_file.txt".如果我双击该文件,Notepad.exe将启动,文件内容将显示"Hello World"."Hello World"将来自我的c#代码.
我希望班级可以做的例子(也许这会更好地解释):
VirtualFile.Register("c:\my_file.txt",
delegate { return Encoding.Ascii.GetBytes("Hello World"); });
Run Code Online (Sandbox Code Playgroud)
当然,这是我正在寻找的简化版本......但希望你能得到这个想法.
这是100%需要的原因是使用遗留代码或专有(和非常旧的遗留垃圾)系统,这些系统需要读取和写入文件系统进行通信.
我正在为ruby寻找一个"虚拟文件系统"类型库.我希望能够拥有一个完全通用的文件系统,我可以在使用本地文件和使用S3或使用FTP之类的东西之间轻松切换.(与VFS for Java相同)
有没有人为ruby使用任何类型的通用文件系统(我只需要它来支持本地文件和Amazon S3)
任何指针都将非常感激.
我需要创建一个虚拟文件系统,将文件从我的 Azure 应用服务同步到本地驱动器并向后同步。我只需要将一些文件和文件夹同步到我的本地文件系统并可以离线使用。文件/文件夹应在首次访问期间或用户选择“始终保留在此设备上”菜单时同步。类似于 OneDrive 的做法。我找到了 Microsoft CloudMirror C++ 示例,它具有一些基本的 OneDrive 功能,但它在启动期间同步所有文件一次,并且在第一次访问时没有列出/加载。
是否可以完全在 .NET 中构建具有上述功能的虚拟文件系统?
我正在为CRI Middleware的ROFS(见维基百科)等视频游戏编写某种虚拟文件系统库.我对图书馆的意图是提供访问我开发的游戏资源的自然方法,它存储可执行文件中嵌入的一些数据,一些存储在媒体上,一些存储在本地用户的硬盘上(首选项,保存游戏文件等) .
访问这些资源应该像打电话一样简单
std::auto_ptr<std::istream> defaultConfigIStream(
fslib.inputStream("self://defaultConfig.ini"));
std::auto_ptr<std::ostream> defaultConfigOStream(
fslib.outputStream("localappdata://config.ini"));
// Copies default configuration to local user's appdata folder
defaultConfigIStream >> defaultConfigOStream;
Run Code Online (Sandbox Code Playgroud)
实际的做事方式实际上是不同的,另一个抽象层用于后台加载,但这在这里并不重要.
我想知道的是,我怎么能返回那个auto_ptr<>(或者unique_ptr<>你选择),因为当它被破坏时,与它std::streambuf<>相关联的东西std::[i/o]stream<>不被它删除.
我正在考虑std::[i/o]stream<>不建议在构建时传递给它的streambuf的所有权,因为构造函数不提供所有权语义的转移,Apache的STDCXX引用没有提到所有权的转换(我找不到任何stdlib引用)在网上).
我有什么替代品?我不妨返回一个共享指针并继续观察它,直到FSlib管理器保留共享指针的唯一副本,在这种情况下它会破坏它的唯一副本以及streambuf.考虑到图书馆的组织模式,这是切实可行的,但对于这个问题,这不是很优雅也不高效.
我试过看看Boost.Iostreams,但看起来事情对我来说更糟糕,因为流本身的设备类型强烈附加到它们的类型(流的设备必须在其模板参数中定义) ).这个问题似乎使得我的库使用Boost.Iostreams是不可行的,因为它需要抽象出流的具体"源/接收器"实现,以便流可以无缝地用于打开位于可执行文件本身内的文件,例如,在系统文件系统的文件内或存档类型文件中.
我可以写一个处理这些问题的容器类,但我宁愿更干净地做(也就是刚刚返回流;这就是它应该需要的全部!;).
建议?
是否有适用于.NET的简易库来安装虚拟驱动器?
我需要在虚拟驱动器中安装存档,并且很可能使用虚拟文件系统.
存档格式不支持文件夹,因此我需要从存档中手动提供文件和文件夹.也不支持属性,但我使用元数据文件来存储它们.
我对驱动器和FS的控制越多越好.
我正在使用Windows资源管理器命名空间扩展,它是一个虚拟文件系统.关于这一点,我想支持Windows资源管理器中提供的搜索对话框中的搜索.
目前我能够在我所站的文件夹中按名称进行搜索,但我希望能够在整个结构中以及虚拟文件系统的内容中进行搜索,并且由于Windows资源管理器无法执行此操作,因此我需要挂钩自定义搜索提供程序.
由于它是一个虚拟文件系统,如果我可以编写一个自定义UI来显示结果,这将是有益的,但这不是强制性的.
自定义Explorer命名空间扩展是用C#编写的,但不需要包装API.任何指向API文档,商业产品和/或样本的指针都将受到赞赏.
我目前正在开发一个模拟操作系统的游戏.因此我需要一个游戏文件系统.目前,我使用zziplib能够从zip存档加载文件,但是这是一个只读"文件系统",我需要一种方法来编写新文件并在之后序列化它们(并在下次执行时反序列化它们)!在野外是否有任何有用的库可供使用,还是我应该根据任何一个为自己编写一个?
对于一个开源项目,我在文件系统之上编写一个抽象层.
该层允许我将元数据和关系附加到每个文件.
我希望图层能够优雅地处理文件重命名,并在重命名/移动或复制文件时维护元数据.
为此,我需要一种计算文件标识的机制.显而易见的解决方案是为每个文件计算SHA1哈希值,然后根据该哈希值分配元数据.但是......这真的很贵,特别是对于电影来说.
所以,我一直在考虑一种算法虽然不是100%正确,但绝大多数时候都是正确的,并且很便宜.
一种这样的算法可以是使用文件大小和该文件的字节样本来计算散列.
我应该为样本选择哪些字节?如何保持计算的便宜和合理准确?我知道这里有一个权衡,但性能至关重要.用户将能够处理系统出错的情况.
我需要这个算法适用于非常大的文件(1GB +和小文件5K)
编辑
我需要这个算法来处理NTFS和所有SMB共享(基于Linux或基于Windows),我希望它支持将文件从一个位置复制到另一个位置的情况(存在2个物理副本被视为一个标识).我甚至可能会考虑在需要重新标记MP3的情况下(物理文件已更改,因此我可能每个文件类型都有一个身份提供程序).
编辑2
相关问题:确定文件身份的算法(优化)
微软和苹果最近推出了用于将云存储文件同步到本地文件系统的API:适用于Windows的Cloud Provider API(也称为Cloud Filter API)和适用于Apple和iOS的File Provider API。例如,Microsoft OneDrive 客户端现在构建在这个新 API 之上。
主要 Linux 版本是否有类似的 API?
我正在使用 Windows Cloud Filter API 创建虚拟驱动器。删除回调在 Windows Home 21H1 19043.1165 (cldflt.sys 10.0.19041.1110) 上按预期停止工作。如果我从 CF_CALLBACK_TYPE_NOTIFY_DELETE 返回错误代码,则无论如何都会删除脱水占位符,无论我返回什么错误代码:
void CALLBACK FakeCloudProvider::OnNotifyDelete(
_In_ CONST CF_CALLBACK_INFO* callbackInfo,
_In_ CONST CF_CALLBACK_PARAMETERS* callbackParameters)
{
CF_OPERATION_INFO opInfo = { 0 };
opInfo.StructSize = sizeof(CF_OPERATION_INFO);
opInfo.Type = CF_OPERATION_TYPE_ACK_DELETE;
opInfo.ConnectionKey = callbackInfo->ConnectionKey;
opInfo.TransferKey = callbackInfo->TransferKey;
opInfo.CorrelationVector = callbackInfo->CorrelationVector;
opInfo.RequestKey = callbackInfo->RequestKey;
CF_SYNC_STATUS_MSG* syncStatus = new CF_SYNC_STATUS_MSG;
syncStatus->Code = STATUS_FILE_LOCKED_WITH_WRITERS;
syncStatus->SetMsg(L"MY TEST");
opInfo.SyncStatus = syncStatus;
CF_OPERATION_PARAMETERS params = {0};
params.ParamSize = sizeof(CF_OPERATION_PARAMETERS);
params.AckDelete.Flags = CF_OPERATION_ACK_DELETE_FLAG_NONE;
// I have also tested many …Run Code Online (Sandbox Code Playgroud)