2010-12-03 4 views
1

J'ai parcouru la documentation WinAPI pendant un moment, mais je ne semble pas pouvoir trouver de réponse. Ce que j'essaye de réaliser est de donner à un programme un nom de fichier qu'il peut ouvrir et travailler avec lui comme ce serait un fichier normal sur le disque. Mais je veux que cet objet soit dans la mémoire.Utilisation de canaux nommés (ou autre chose) en tant que fichiers en mémoire

J'ai essayé d'utiliser des tubes nommés et ils fonctionnent dans certaines situations, mais pas toujours. Je crée un tube nommé et le transmets au processus fils en tant que fichier standard. Quand le processus existe, je recueille les données du tuyau.

program.exe \\.\pipe\input_pipe 

Face à certaines limites cependant. L'un d'eux est qu'ils ne sont pas rechercheables. La deuxième limitation est qu'ils devraient être ouverts avec exactement les bonnes permissions. Et le troisième que j'ai trouvé est que vous ne pouvez pas pré-mettre des données dans un tuyau duplex avant qu'il ait été ouvert à l'autre extrémité. Y a-t-il un moyen de surmonter ces limitations des tuyaux nommés?

Ou peut-être existe-t-il un autre type d'objet qui peut être ouvert avec CreateFile, puis accédé avec ReadFile et WriteFile. Jusqu'à présent, la seule solution que je vois est de créer un pilote de système de fichiers et de mettre en œuvre toutes les fonctionnalités moi-même. Juste pour clarifier, je voulais souligner que je ne peux pas changer le programme enfant que je cours. L'idée principale est de donner à ce programme quelque chose qu'il pense être un fichier normal. MISE À JOUR: Je ne suis pas à la recherche d'une solution impliquant l'installation de logiciels externes.

+0

Pourquoi voulez-vous qu'il soit en mémoire? –

+0

@Len: Deux raisons. Je ne veux pas que quelqu'un puisse voir ce fichier et pour des raisons de performance. – detunized

+1

La raison du perf est faux. Sous Windows, lorsque vous allouez de la mémoire, vous allouez le disque. Le fichier d'échange. Vous n'écrivez jamais sur le disque, vous écrivez en RAM. Et s'il est lu assez rapidement, il est également lu dans la RAM. Le cache du système de fichiers. Environ un gigaoctet sur la plupart des machines 32 bits, beaucoup plus sur les machines 64 bits. –

Répondre

3

Memory-mapped files vous permet de faire ce que vous voulez.

EDIT:

En relisant la question - puisque le programme de réception utilise déjà CreateFile/ReadFile/WriteFile et ne peut pas être modifié, cela ne fonctionnera pas. Je ne peux pas penser à un moyen de faire ce que l'OP veut en dehors de la solution RAMDisk de tiers ou auto-écrite.

+0

J'ai essayé celui-ci deux. Soit j'ai fait quelque chose de mal, soit je ne suis pas capable de faire ce que je dois faire. Est-il possible de créer un objet de mappage de fichier nommé, puis d'utiliser 'CreateFile' ou' fopen'? – detunized

+0

Si vous ne pouvez pas l'ouvrir, vous devriez être en mesure de dupliquerHandle la poignée de mappage dans le processus distant. –

+0

@Chris: La seule chose que je peux transmettre au processus fils est un nom de fichier qui sera introduit dans 'fopen' ou' CreateFile'. – detunized

2

La solution la plus simple pourrait être, comme vous semblez le suggérer, d'utiliser a Ramdisk pour faire correspondre un lecteur virtuel à la mémoire. Alors évidemment, tous les fichiers que vous écrivez ou lisez à partir de ce lecteur virtuel seront complètement contenus dans la RAM (en supposant qu'il ne soit pas paginé sur le disque).

Je l'ai fait quelques fois moi-même pour accélérer un processus qui était entièrement lié au disque.

+0

J'ai pensé à cela mais je ne veux pas que mon programme dépende d'un autre logiciel et que les utilisateurs l'installent. Le pire des cas, je peux le faire moi-même en utilisant la bibliothèque Dokan, mais cela nécessiterait encore une installation du pilote. – detunized

+0

@detunized: Vous devriez mettre à jour votre question pour refléter cela.Je laisse la réponse à quelqu'un d'autre qui rencontre votre question dans une situation similaire. –

+0

Mis à jour. Et merci pour le lien utile. – detunized

0

Appelez CreateFile mais avec FILE_ATTRIBUTE_TEMPORARY et probablement FILE_FLAG_DELETE_ON_CLOSE.

Le fichier ne frappera jamais sur le disque à moins que le système ne dispose d'une mémoire physique insuffisante.

+0

Merci, je le sais, mais ce n'est pas ce dont j'ai besoin. – detunized

+0

Qu'est-ce qui ne convient pas? Vous semblez vouloir un objet semblable à un fichier qui existe uniquement en mémoire et, de préférence, peut être accessible via CreateFile/ReadFile/WriteFile. Vous pouvez faire toutes ces choses avec un fichier réel. :) Quelle est l'exigence supplémentaire ici? –

+0

Ce n'est pas vraiment en mémoire. Lorsque le processus enfant se bloque, les fichiers vont sur le disque. J'ai essayé. – detunized

Questions connexes