C# 使用Win NT内核API连接大文件

C# 使用Win NT内核API连接大文件,c#,.net,windows-kernel,windows-nt,nt-native-api,C#,.net,Windows Kernel,Windows Nt,Nt Native Api,我一直在寻找一种将大文件(几GB)连接在一起而不必重写其中一个文件的方法。我确信操作系统在操作主文件表时会在内部执行此操作。这仅适用于速度至关重要的内部应用程序,即使以数据完整性为代价(如果存在未记录API的风险)。该应用程序处理大量高带宽、多通道以太网数据,其中损坏的工作单元(本例中为文件)不会对整体处理结果产生重大影响 当组合文件A和B时,所涉及的工作量等于:A[Read]+B[Read]+C[Write]`。你们中的任何一位NT专家都会对如何绕过这一点直接进入MFT有所启发吗 我还没能得到

我一直在寻找一种将大文件(几GB)连接在一起而不必重写其中一个文件的方法。我确信操作系统在操作主文件表时会在内部执行此操作。这仅适用于速度至关重要的内部应用程序,即使以数据完整性为代价(如果存在未记录API的风险)。该应用程序处理大量高带宽、多通道以太网数据,其中损坏的工作单元(本例中为文件)不会对整体处理结果产生重大影响

当组合文件
A
B
时,所涉及的工作量等于:
A[Read]+B[Read]+
C[Write]`。你们中的任何一位NT专家都会对如何绕过这一点直接进入MFT有所启发吗

我还没能得到任何线索来探索哪种API,希望能有一些指点。虽然应用程序是托管的,但我很乐意探索本机API,甚至设置轻量级VM进行测试


提前感谢。

这不是一个文件系统能做到的。文件系统根据集群和数据块(而不是字节)为文件分配空间。只有当两个文件都是集群大小的倍数时,这样连接两个文件才会起作用,并且FS可能会对如何将块分配给封面下的文件有其他假设。如果您卸载了文件系统并编写了一个工具来直接操作所有文件系统结构,那么您自己就可以对文件系统执行此操作。但是,如果这样做的话,您可能会损坏整个磁盘,而不仅仅是一个文件。

如果您要将文件B附加到文件a,您所要做的就是打开文件a进行写+附加,查找文件的结尾,然后从B读取并写入a

如果要创建文件C作为文件A和文件B的连接,则必须创建文件C并将A复制到C,然后将B复制到C


没有任何捷径。

我不知道您的具体情况,但是否可以不将文件附加在一起?只要在接收数据时不断将文件放入某个目录,并保留索引即可

然后,当需要数据时,使用索引将数据拼凑在一起以创建一个新文件?
因此,您只需按需进行昂贵的文件合并?

在许多文件系统中,您的建议是不可能的,因为这些文件系统要求属于某个文件的每个群集都是连续的数据,但最后一个除外。打开a,将文件指针设置为文件的结尾,然后写入B的内容。破解MFT毫无意义。在这个过程中,尤其是在一个错误上,丢失一个数据通常被认为是不可接受的。