我有一个遗留应用程序,用于查找目录中的文件。它不能很好地处理丢失的文件。我想要做的是“捕获”文件未找到错误,并将另一个文件发送回调用应用程序。类似于如何在Web服务器上处理404错误并根据请求的URL返回内容,除了在本地文件系统上。
这可能吗?更优选的是,是否可以在.Net?
答案 0 :(得分:2)
是的,你所描述的是可能的。
我建议使用filesystem filter driver or mini filter来处理这种类型的事情,尽管在.Net中无法做到这一点。
我建议的方式可能是在文件系统级别捕获所有内容的最恰当方式。
答案 1 :(得分:2)
您可以通过拦截对Win API函数CreateFile的调用来完成此操作。这需要dll注入。在.NET中,您可以使用此库:easyhook.codeplex.com
答案 2 :(得分:2)
如果商业解决方案可以接受,那么像Eldos CallbackFilter这样的东西可能符合要求:
http://www.eldos.com/cbflt/spec.php
我没有完全用你的目的使用它,但你当然可以拦截文件系统调用,你可以检查文件是否存在,如果不存在则创建一个虚拟文件。
对于整理行为不当的遗留应用程序来说,这可能更为直接。
答案 3 :(得分:1)
如果您知道进程中的代码将打开文件的位置,您可以编写一个围绕它的包装器进程,其作用类似于调试器,拦截该调用,检查它是否存在,如果不存在,如果不存在,用不同的文件名替换文件名。
类似的东西:
CreateProcess(bla bla, DEBUG_ONLY_THIS_PROCESS, bla bla);
SetBreakPoint(address of code to set breakpoint)
{
ReadProcessMemory to save off byte for breakpoint
WriteProcessMemory 0xCC to set breakpoint
FlushInstructionCache
}
while (TRUE == bContinue)
{
bContinue = WaitForDebugEvent(&debugEvent);
switch (dwDebugEventCode)
{
case EXCEPTION_BREAKPOINT:
// Read the file name from memory, check if it exists, if not, replace it with
// new file name using the same length in memory :)
// Replace your code byte you read out when you set the breakpoint
}
}
另一种方法是使用您自己对CreateFile的调用(或者他们在相关应用中使用的任何内容)覆盖函数调用表。查找API挂钩,甚至Dll注入都可以帮助你。