2010-12-03 22 views
1

私はしばらくの間、WinAPIのドキュメントを読んできましたが、私は答えを見つけることができないようです。私が達成しようとしているのは、プログラムを開くことができ、ディスク上の通常のファイルのように動作するファイル名をプログラムに与えることです。しかし、私はこのオブジェクトを記憶に残しておきたい。名前付きパイプ(または何か他のもの)をメモリ内のファイルとして使用する

名前付きパイプを使用しようとしましたが、いくつかの状況で動作しますが、必ずしもそうではありません。名前付きパイプを作成し、それを子プロセスに通常のファイルとして渡します。プロセスが存在するとき、私はパイプからデータを収集します。

program.exe \\.\pipe\input_pipe 

しかし、いくつかの制約に直面しています。そのうちの1つは、彼らが求めることができないということです。 2つ目の制限は、適切なアクセス権でそれらを開く必要があることです。そして私が見つけた3つ目は、もう一方の端が開いている前に、デュプレックスパイプにデータをあらかじめ置くことができないことです。名前付きパイプの制限を克服する方法はありますか?

CreateFileで開き、次にReadFileWriteFileでアクセスできるオブジェクトがあります。これまで私が見る唯一の解決策は、ファイルシステムドライバを作成し、すべての機能を自分で実装することです。

ちょうど私が私が実行している子プログラムを変更することはできませんことを指摘したかったことを明確にします。主なアイデアは、そのプログラムに普通のファイルだと思うものを与えることです。

更新:外部ソフトウェアのインストールが必要なソリューションは探していません。

+0

なぜあなたはそれを記憶に入れたいですか? –

+0

@ Len:2つの理由があります。私は誰もこのファイルを見ることができないようにしたい。 – detunized

+1

perfの理由は偽です。 Windowsでは、メモリを割り当てるとディスクを割り当てます。ページングファイル。ディスクに書き込むことは決してありません。あなたはRAMに書き込みます。そしてそれが十分に速く読まれれば、RAMからも読み込まれます。ファイルシステムキャッシュ。ほとんどの32ビットマシンでは約1ギガバイト、64ビットマシンではさらに多くのものがあります。 –

答えて

3

Memory-mapped filesはあなたがやりたいことができるでしょう。

EDIT:

質問を再読オン - 受信プログラムが既にCreateFile/ReadFile/WriteFileを使用して変更することができないので、これは動作しません。私は、OPがサードパーティ製のRAMディスクソリューションの外で望むものをやり遂げる方法を考えることはできません。

+0

私はこの2つを試しました。私は何か間違ったことをしたか、私がやるべきことをすることができません。名前付きファイルマッピングオブジェクトを作成し、その上に 'CreateFile'または' fopen'を使用する方法はありますか? – detunized

+0

これを開くことができない場合は、マッピングハンドルをリモートプロセスにDuplicateHandleできる必要があります。 –

+0

@Chris:子プロセスに渡すことができるのは、 'fopen'または' CreateFile'に送られるファイル名だけです。 – detunized

2

最も簡単な解決策は、あなたがメモリにマップされた仮想ドライブを作成するa Ramdiskを使用して、提案しているように見えるよう、かもしれません。その後、明らかに、その仮想ドライブに書き込んだり読み込んだりするファイルはすべてRAMに完全に格納されます(ディスクにページされないと仮定して)。

私は数回自分が完全にディスクに頼ったプロセスをスピードアップすることをやりました。

+0

私はそれを考えましたが、自分のプログラムが他のソフトウェアに依存していないようにして、ユーザーがそれをインストールできるようにしたいと思います。最悪の場合、私はDokanライブラリを使って自分でそれを行うことができますが、それでもドライバのインストールが必要です。 – detunized

+0

@detunized:それを反映するために質問を更新する必要があります。私は、同様の状況にある間にあなたの質問に出くわす他の誰かのために答えを残しています。 –

+0

が更新されました。そして、役に立つリンクに感謝します。 – detunized

0

コールのCreateFile FILE_ATTRIBUTE_TEMPORARYと、おそらくFILE_FLAG_DELETE_ON_CLOSE同様けど。

物理メモリが不足していない限り、ファイルはディスクに書き込まれません。

+0

ありがとう、私はこれを知っているが、それは私が必要なものではない。 – detunized

+0

それはどうして不適切ですか?メモリにのみ存在するファイルのようなオブジェクトが必要なように思えます。できれば、CreateFile/ReadFile/WriteFileでアクセスできます。実際のファイルでこれらのことをすべて行うことができます。 :)ここで余分な要件は何ですか? –

+0

それは本当に記憶にありません。子プロセスがクラッシュすると、ファイルはディスクに移動します。私は試した。 – detunized

関連する問題