2010-07-10 7 views
1

J'ai un programme (appelons-le "a.exe" par exemple) qui lit sa config à partir de plusieurs fichiers. puis-je écrire un autre programme pour rediriger tous les accès aux fichiers de "a.exe" vers un autre flux (console par exemple)?Rediriger un flux de fichier dans le flux mémoire

Je n'ai pas le code de "a.exe" mais si j'obtiens le code source de a.exe, évidemment je peux changer tous les accès aux fichiers. mais existe-t-il un moyen possible de remplacer tous les accès aux fichiers par des changements très "minimum"? par exemple remplaçant la fonction file.open ou quelque chose comme ça?

Répondre

0

Une idée simple consiste à avoir un autre programme ou script fournissant des canaux nommés au lieu des fichiers réels. Une fois que a.exe essaie de lire à partir d'eux, il va bloquer jusqu'à ce que quelque chose d'autre envoie des données à travers le tuyau.

Comme dans Linux vous pouvez faire:

mkfifo config.txt # if a.exe uses config.txt 
./a.exe # a.exe will now block until you write to config.txt and close it 

Ils devraient travailler sous Windows aussi, il semble: Wikipedia on Named Pipes

Sauf cela, ou si vous voulez faire quelque chose de plus avancé, vous auriez à examinez les outils qui accrochent ou remplacent les appels de bibliothèque externes pour un binaire donné.

+0

Les restrictions de dénomination de tuyau sur Windows empêchent le remplacement transparent d'un fichier par un canal nommé. C'est une bonne approche sur Linux, je l'ai utilisé moi-même. –

+0

merci beaucoup pour votre réponse rapide. J'ai mis à jour la question en passant. – Sangihi

0

Depuis ofstream hérite de ostream, dans une fonction où vous avez f(ostream& os) à la fois cout et ofstream ofs peuvent être utilisés. De même, lors de l'analyse, vous pouvez dire:

ofstream ofs("output.txt"); 
ostream& os = (write_to_file) ? ofs : std::cout; 
Questions connexes