Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#创建连续文件?_C#_.net_File Io - Fatal编程技术网

使用C#创建连续文件?

使用C#创建连续文件?,c#,.net,file-io,C#,.net,File Io,是否可以使用C#在磁盘上创建一个大的(物理上)连续文件?最好只使用托管代码,但如果不可能,则最好使用非托管解决方案。简言之,不需要 操作系统将在后台执行此操作,我要做的是使文件尽可能大,这样操作系统将连续放置文件。如果您需要增加文件的大小,您可以再次以每次10%的速度增加它。 这与SQL server保存数据库文件的方式类似 打开使用append打开的文件流 例如: FileStream fwriter = new FileStream("C:\\test.txt", FileMode.Appe

是否可以使用C#在磁盘上创建一个大的(物理上)连续文件?最好只使用托管代码,但如果不可能,则最好使用非托管解决方案。

简言之,不需要

操作系统将在后台执行此操作,我要做的是使文件尽可能大,这样操作系统将连续放置文件。如果您需要增加文件的大小,您可以再次以每次10%的速度增加它。 这与SQL server保存数据库文件的方式类似

打开使用append打开的文件流

例如:

FileStream fwriter = new FileStream("C:\\test.txt", FileMode.Append,     FileAccess.Write, FileShare.Read);

您创建的任何文件在逻辑上都是连续的

如果您想要物理上连续,那么您位于OS和FS区域。真的(远远)超出了普通I/O API的控制范围


但最接近的可能是预先声明空间:创建一个空流,并将Length或Position属性设置为所需的值

使用现代文件系统,很难确保硬盘上有一个连续的文件。从逻辑上讲,文件始终是连续的,但保存数据的物理块因文件系统而异

最好的办法是使用旧的文件系统(ext2、FAT32等),然后使用seek请求一个大文件,使其达到所需的文件大小,然后刷新此文件。更先进的文件系统可能会标记一个较大的文件大小,但实际上不会将任何内容写入硬盘,而是在将来读取时返回零,而不会实际读取

int fileSize = 1024 * 1024 * 512;
FileStream file = new FileStream("C:\\MyFile", FileMode.Create, FileAccess.Write);
file.Seek(fileSize, SeekOrigin.Begin);
file.Close();
编写碎片整理程序

听起来你在寻找碎片整理API:-

底部的链接,因为您似乎错过了有人制作的C#包装


要构建数据库,您需要使用Windows API提供的分散-聚集I/O功能。这是一种特殊类型的文件I/O,允许您将文件中的数据“分散”到内存中,或从内存中“收集”数据并将其写入文件的相邻区域。虽然数据分散或从中收集的缓冲区不需要是连续的,但源或目标文件区域始终是连续的

此功能由两个主要功能组成,它们都异步工作。从磁盘上的文件读取连续数据,并将其写入非连续内存缓冲区数组。从内存缓冲区读取非连续数据,并将其写入磁盘上的连续文件。当然,您还需要这两个函数都使用的

这正是SQL Server在读取和写入数据库和/或其日志文件时使用的功能,事实上,此功能已添加到早期的NT 4.0 service pack中,专门供SQL Server使用

当然,这是相当高级的东西,对于心脏虚弱的人来说很难。令人惊讶的是,你可以在pinvoke.net上找到P/Invoke的定义,但我对这个网站有强烈的怀疑。由于您需要花大量的时间来理解这些函数是如何工作的,因此您最好自己编写声明。从C#开始做这件事会给你带来很多额外的问题,所以我甚至不推荐这样做。如果这种I/O性能对您来说很重要,那么我认为您使用的工具是错误的


穷人的解决方案是contig.exe,一个可免费下载的单文件碎片整理程序。

这将确保在硬盘上,文件将连续写入?我想不是。你的更新仍然不正确。操作系统不会自动将文件写入磁盘上物理上相邻的位置,也不会在后台写入文件,除非您明确告诉它要进行碎片整理(即使这样,也不能保证事情会精确地进行到哪里)。身体接触是OP要求的一个重要警告。您缺少有关SQL Server实现的一些详细信息。NTFS将自动尝试将文件(如有可能)放置在可以放置在一个位置的位置,这是一个错误的做法,假设您在1个大卡盘中制作文件。每次你种植它,它都有可能变得支离破碎。(FAT32不会做上述事情)为什么您觉得需要一个物理上连续的文件?你想解决什么问题?我正在构建一种nosql数据库,磁盘io性能是优先考虑的。数据库解决方案,如mysql、sqlserver,总是使用连续文件来提高性能。是的,也许吧。但是不要在C#中这样做。老实说,尽管是非托管的,但这是迄今为止唯一一个可以生成连续文件的解决方案,UPPOUTED。考虑到询问者想这样做的原因是他试图实现一个数据库,使用旧的文件系统是行不通的。FAT32特别限制最大文件大小为4 GB。我相信ext2也有类似的限制(大约2GB或4GB),但我没有任何使用该文件系统的经验,所以我不确定。也不能保证FAT32会返回一个物理上连续的块。你是对的。FAT32比任何其他当前文件系统(尤其是日志文件系统)的Ext4、NTFS更有可能做到这一点。当然,这不是保证,但如果不访问一些文件系统级工具(如其他人建议的碎片整理API),这是我能提出的最好建议。。