在Windows中,有可能通过API写入到文件的中间而不覆盖任何数据,而不必在之后重写所有的数据?
如果可能的话,我相信它会明显地分割文件; 在成为严重问题之前,我可以做多less次?
如果不可能采取什么方法/解决方法? 在插入点之后重写所有内容对于大(即,千兆字节)的文件来说非常快速。
注 :我不能避免写中间。 将应用程序看作是文本编辑器,用于input大量文件,然后保存。 我也不能分割几个较小的文件。
是否有可能从外部检测到“结束进程”?
UPNP在Linux上发布并在Windows上发现?
使用Windows Runner上载工件
使用C#应用程序的给定URL激活现有浏览器窗口(不触发重新加载)
Windows多处理
如何使用C#/ .NET代码获取ClickOnce应用程序path和版本号?
Windows 8/10中活动窗口的进程名称
Windows上的Java需要loggingcpu负载和类似的操作系统特定的性能信息
embedded式数据库使用外部ODBC访问的build议?
如果您需要的临时结果是一个可以由编辑器以外的其他应用程序使用的平面文件,我不知道有什么办法可以做到这一点。 如果你想生成一个平面文件,你将不得不从更改点更新到文件结尾,因为它实际上只是一个顺序文件。
但斜体是有原因的。 如果你可以控制文件格式,你有一些选择。 一些版本的MS Word有一个快速保存功能,他们没有重写整个文档,而是在文件末尾添加了一个增量记录。 然后,在重新读取文件时,它会按顺序应用所有的增量,以便您最终得到的是正确的文件。 如果保存的文件必须立即可用于另一个不了解文件格式的应用程序,则这显然不起作用。
我提议的是不要将文件存储为文本。 使用可以高效编辑和保存的中间表单,然后执行一个将其转换为可用文本文件的步骤(例如,在编辑器退出时)。 这样,用户可以尽可能多地保存,但是耗时的操作不会有太大的影响。
除此之外,还有其他一些可能性。
内存映射(而不是加载)文件可能会提高效率,从而加快速度。 您可能仍然需要重写到文件末尾,但在操作系统中会发生在较低的级别。
如果要快速保存的主要原因是让用户继续工作(而不是让文件可用于其他应用程序),则可以将保存操作放到单独的线程中,并立即将控制权返回给用户。 那么你需要在两个线程之间进行同步,以防止用户修改数据并保存到磁盘。
现实的答案是否定的。 你唯一真正的选择是从修改的角度重写,或者建立一个更复杂的格式,使用类似索引的东西来告诉如何按照预定的顺序排列记录。
从纯粹的理论观点来看,你可以在恰当的情况下做到这一点。 使用FAT(例如,但大多数其他文件系统至少有一定程度的相似性),你可以直接操作FAT。 FAT基本上是组成文件的簇的链表。 您可以修改该链接列表以在文件中间添加新集群,然后将新数据写入到您添加的集群中。
请注意,我说纯粹的理论。 在像MS-DOS这样的完全不受保护的系统下进行这种操作本来就是困难的,但却是合理的。 对于大多数较新的系统,进行修改通常会相当困难。 大多数现代文件系统也(相当)比FAT更复杂,这将增加执行的难度。 从理论上讲,这仍然是可能的 – 事实上,现在已经彻底的疯狂,甚至已经几乎是合理的。
我不确定你的文件的格式,但你可以使它“记录”的基础。
将数据分块写入,并为每个块分配一个ID。
Id可能是文件中的数据偏移量。
在文件的开始,你可以有一个ID列表的标题,以便您可以按顺序读取记录。
在“ID列表”的末尾,你可以指向文件中的另一个位置(和ID /偏移量),存储另一个ID列表
类似于文件系统的东西。
要添加新数据,请在末尾附加它们并更新索引(将id添加到列表中)。
你必须弄清楚如何处理删除记录和更新。
如果记录的大小相同,那么删除就可以将其标记为空,然后再次将其重新用于索引表的更新。
如果使用.NET 4,如果您有类似编辑器的应用程序,请尝试使用内存映射文件 – 可能只是票证。 像这样的东西(我没有输入到VS,所以不知道我的语法是否正确):
MemoryMappedFile bigFile = MemoryMappedFile.CreateFromFile( new FileStream(@"C:bigfile.dat",FileMode.Create),"BigFileMemmapped",1024 * 1024,MemoryMappedFileAccess.ReadWrite); MemoryMappedViewAccessor view = MemoryMapped.CreateViewAccessor(); int offset = 1000000000; view.Write<ObjectType>(offset,ref MyObject);
我注意到paxdiablo在处理其他应用程序方面的答案,以及Matteo Italia对可安装文件系统的评论。 这让我意识到还有另一个不重要的解决方案。
使用重新分析点,您可以从基本文件加上增量变量创建一个“虚拟”文件。 任何不知道这种方法的应用程序都会看到一个连续的字节范围,因为增量是由文件系统过滤器实时应用的。 对于小的delta(总共<16 KB),delta信息可以存储在重新分析点本身; 更大的三角洲可以被放置在另一个数据流中。 当然不平凡。
也许最有效的方法是(如果你真的想这样做的话)是调用ReadFileScatter()来读取插入点前后的块,将新数据插入FILE_SEGMENT_ELEMENT[3]列表的中间,调用WriteFileGather() 。 是的,这涉及在磁盘上移动字节。 但是,你将困难的部分留给了操作系统。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。