Создать непрерывный файл с помощью C #? - PullRequest
3 голосов
/ 02 февраля 2011

Можно ли создать большой (физически) непрерывный файл на диске с помощью C #?Желательно использовать только управляемый код, но если это невозможно, будет приветствоваться неуправляемое решение.

Ответы [ 5 ]

5 голосов
/ 02 февраля 2011

Любой созданный вами файл будет логически смежным.

Если вы хотите быть физически смежными, вы находитесь на территории ОС и ФС. Действительно (далеко) вне контроля нормальных API ввода-вывода.

Но то, что, вероятно, приблизится, это потребовать пространство заранее: создайте пустой поток и установите для свойства Length или Position то, что вам нужно.

3 голосов
/ 02 февраля 2011

Записываете дефрагментатор?

Похоже, вы все равно используете API дефрагментации: -

http://msdn.microsoft.com/en-us/library/aa363911%28v=vs.85%29.aspx

Ссылка снизу, потому что кажетсявы пропустили оболочку C #, которую кто-то любезно изготовил.

http://blogs.msdn.com/b/jeffrey_wall/archive/2004/09/13/229137.aspx

2 голосов
/ 02 февраля 2011

В современных файловых системах трудно обеспечить непрерывный файл на жестком диске.Логически файл всегда является смежным, но физические блоки, которые хранят данные, варьируются от файловой системы к файловой системе.

Лучшим вариантом для этого будет использование старой файловой системы (ext2, FAT32 и т. Д.)и просто запросите большой файл, используя поиск нужного размера файла, а затем сбросьте этот файл.Более современные файловые системы, вероятно, будут помечать файлы большого размера, но на самом деле ничего не будут записывать на жесткий диск, вместо этого возвращая нули при последующем чтении без фактического чтения.

int fileSize = 1024 * 1024 * 512;
FileStream file = new FileStream("C:\\MyFile", FileMode.Create, FileAccess.Write);
file.Seek(fileSize, SeekOrigin.Begin);
file.Close();
1 голос
/ 02 февраля 2011

Для создания базы данных вам нужно будет использовать функции ввода-вывода с разбросом, предоставляемые Windows API.Это особый тип файлового ввода-вывода, который позволяет вам «разбрасывать» данные из файла в память или «собирать» данные из памяти и записывать их в непрерывную область файла.Хотя буферы, в которые разбросаны данные или из которых они собраны, не обязательно должны быть смежными, область файла источника или назначения всегда является смежной.

Эта функция состоит из двух основных функций, каждая из которых работает асинхронно.Функция ReadFileScatter считывает непрерывные данные из файла на диске и записывает их в массив несмежных буферов памяти.Функция WriteFileGather считывает несмежные данные из буферов памяти и записывает их в непрерывный файл на диске.Конечно, вам также понадобится структура OVERLAPPED , которая используется обеими этими функциями.

Это именно то, что SQL Server использует, когда он читает и записывает в базу данных и/ или его файлы журналов, и фактически эта функциональность была добавлена ​​в ранний пакет обновления для NT 4.0 специально для использования SQL Server.

Конечно, это довольно продвинутый уровень, и вряд ли для слабонервных,Удивительно, но на самом деле вы можете найти определения P / Invoke на pinvoke.net, но у меня крайне скептическое недоверие к сайту.Поскольку вам нужно потратить много времени на документирование, чтобы понять, как работают эти функции, вы также можете написать декларации самостоятельно.И выполнение этого из C # создаст целый ряд дополнительных проблем для вас, так что я даже не рекомендую это.Если для вас важен этот тип производительности ввода-вывода, я думаю, что вы используете не тот инструмент для работы.

Решение для бедняка - contig.exe , одноразовыйфайл дефрагментации доступен для бесплатной загрузки здесь .

0 голосов
/ 02 февраля 2011

Короче нет тогда

ОС сделает это в фоновом режиме, я бы сделал файл настолько большим, насколько вы ожидаете, таким образом ОС будет размещать его осторожно.И если вам нужно увеличить файл, вы снова увеличиваете его примерно на 10% каждый раз.Это похоже на то, как SQL-сервер хранит свои файлы базы данных.

Открыть, открыв FileStream, который вы открываете с добавлением.

Пример:

FileStream fwriter = new FileStream("C:\\test.txt", FileMode.Append,     FileAccess.Write, FileShare.Read);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...