Используйте именованные каналы (или что-то еще) в качестве файлов в памяти - PullRequest
2 голосов
/ 03 декабря 2010

Я какое-то время просматривал документацию по WinAPI, но, похоже, мне не удалось найти ответ. Я пытаюсь дать программе имя файла, которое она может открыть, и работать с ним так, как если бы это был обычный файл на диске. Но я хочу, чтобы этот объект был в памяти.

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

program.exe \\.\pipe\input_pipe

Столкнулся с некоторыми ограничениями, хотя. Одним из них является то, что они не ищут. Второе ограничение заключается в том, что они должны быть открыты с правильными разрешениями. И третий, который я обнаружил, заключается в том, что вы не можете предварительно поместить какие-либо данные в дуплексный канал, пока они не были открыты на другом конце. Есть ли способ преодолеть эти ограничения именованных каналов?

Или, может быть, есть какой-то другой объект, который можно открыть с помощью CreateFile, а затем получить доступ с помощью ReadFile и WriteFile. Пока единственное решение, которое я вижу, - это создать драйвер файловой системы и реализовать все функции самостоятельно.

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

ОБНОВЛЕНИЕ: я не ищу решение, которое включает установку какого-либо внешнего программного обеспечения.

Ответы [ 3 ]

4 голосов
/ 03 декабря 2010

Файлы с отображением в памяти позволят вам делать то, что вы хотите.

EDIT:

При перечитывании вопроса - поскольку принимающая программа уже использует CreateFile/ReadFile/WriteFile и не может быть изменена, это не будет работать. Я не могу придумать способ сделать то, что хочет OP, вне стороннего или написанного самостоятельно решения RAMDisk.

2 голосов
/ 03 декабря 2010

Самое простое решение, как вы, вероятно, предлагаете, - использовать Ramdisk для создания виртуального диска, сопоставленного с памятью. Тогда очевидно, что любые файлы, которые вы записываете или читаете с этого виртуального диска, будут полностью храниться в ОЗУ (при условии, что они не будут записаны на диск).

Я сам несколько раз делал это, чтобы ускорить процесс, полностью связанный с диском.

0 голосов
/ 03 декабря 2010

Вызовите CreateFile, но с FILE_ATTRIBUTE_TEMPORARY и, возможно, также с FILE_FLAG_DELETE_ON_CLOSE.

Файл никогда не попадет на диск, если в системе недостаточно физической памяти.

...