6
votes

Obtenir une poignée d'un STD :: destream

est-il possible d'obtenir la poignée de fichier sous-jacente d'un STD :: destream (Visual C ++ 2005)?

C'est le contraire de cette question:

Puis-je utiliser Createefile, mais force la poignée dans une STD :: destream?

La raison pour laquelle je veux, il s'agit de modifier les attributs du fichier (par exemple le temps de création) sans avoir à ouvrir le fichier avec Createefile.


2 commentaires

La bibliothèque standard est, eh bien, standard, elle n'a donc aucune idée de votre système d'exploitation et ne peut pas fournir de fonctionnalité en conséquence; Il doit fonctionner partout. La réponse est donc non en C ++, mais éventuellement oui en non standard C ++; Je ne sais pas si ce dernier est une option non plus, vous devrez peut-être simplement aller "long" chemin, mais je voulais m'assurer que c'était clair.


J'étais heureux d'utiliser une solution qui n'a travaillé que dans Visual C ++


6 Réponses :


5
votes

La norme C ++ ne fournit aucun moyen de spécifier ou de récupérer les descripteurs de fichier bruts d'un detream , donc je ne crois pas que cela soit possible. Ce que est possible, cependant, serait de créer une classe personnalisée streambuf qui implémente la mémoire tampon de flux vers et à partir d'un de la poignée , puis de définir une coutume ostream type qui utilise ce tampon. Je ne sais pas si c'est vraiment ce que vous recherchez, mais c'est une option viable.


0 commentaires

1
votes

non. Vous ne pouvez même pas obtenir au fichier * (ou _filet * comme il est connu en interne) Intérieur STD :: BASIC_FILEBUF . .


0 commentaires

-1
votes

Avec les bibliothèques VisualC ++ 2010, les éléments suivants doivent fonctionner. Je suppose que c'est la même chose pour VisualC ++ 2005, mais vous devrez vérifier:

FILE* fh = fopen(...);

HANDLE hFile = (HANDLE)_get_osfhandle(_fileno(fh));
// do something on hFile

// create iostream from FILE
std::ifstream ifs(fh);

// use it...

// close FILE
_close(fh);


5 commentaires

std :: ifstream n'a pas de tel constructeur. Est-ce une extension ou une supposition sauvage?


C'est une extension (sans papiers!) Sur VC10 - Je ne sais pas sur VC2005, mais je suppose que c'est là aussi. Si l'OP a besoin d'une solution à l'épreuve future, j'étais également implémenter un streambuf personnalisé, comme suggéré par @TemplateTypedef.


D'accord. Vous devriez mentionner que cela ne fonctionne que sur VC10 comme extension à votre réponse, puis.


Cela résout la moitié du problème, c'est-à-dire que le fichier * -> la poignée, mais je cherchais un moyen d'aller de côté -> poignée. Dans le code où je voulais utiliser cela, je n'ai que l'Ofstream.


@ MPIpe3: Je vois. Je ne pense pas que ce soit possible alors. Il n'y a pas d'interface publique pour récupérer la poignée du fichier.



1
votes

Ceci n'est pas possible dans Standard C ++. Cependant, avec boost.iostreams bibliothèque Il est pas si difficile. Créez un périphérique , enveloppez-le dans un boost :: iostreams :: stream_buffer <> et ajoutez un flux approprié en utilisant boost :: iostreams :: flux <> .


0 commentaires

5
votes

Ma réponse doit être préférée avec "Je suis un développeur UNIX, pas un développeur Windows". Mais j'avais le même problème que vous avez fait, et c'est comme ça que j'ai choisi de le traquer. J'aimerais avoir une meilleure réponse. Ma réponse ci-dessous rendra votre peau de peau, mais cela a fonctionné.

Tout d'abord, nous aurons besoin du _filet * de la FDBUF. Ceci est un membre privé, nous ne pouvons donc pas simplement créer une nouvelle classe qui nous donne la visibilité. Donc, je modifie l'en-tête de FRStream pour ajouter une nouvelle fonction d'ami dans FileBuf, de sorte que la fonction spécifique nous permettrait de tricher et d'accéder à ce membre (je l'ai ajouté juste en dessous de la définition "_filet * _myfile;"): p> xxx pré>

Nous avons maintenant une fonction publique pour accéder au membre privé. La deuxième étape consiste à écrire la fonction: p> xxx pré>

enfin, il vous suffit de l'appeler, sauf que RDBUF renvoie le mauvais type (IOBUF plutôt que FILEBUF). Depuis que nous sommes déjà désactivés dans "Ici, il y a des dragons" pour tout ce processus, nous pouvons aussi bien faire em> la peau de la peau de tout le monde (mais dans la vie réelle, tapez ici pour valider la distribution à la dérivée. Type): P>

  __HACK_getFilebufHANDLE((filebuf*)fopoutstrm.rdbuf())


0 commentaires

0
votes

non. J'essaie de nombreuses façons. Cette ligne: "std :: ifstream ifs (fh);" peut ne pas wrooker dans certaines mSvs, tels que 2008.

Je trouve un autre moyen, vous pouvez énumérer la poignée dans votre processus et trouver la poignée qui related du nom de fichier.

De cette façon, je reçois la poignée.


1 commentaires

Pourriez-vous peut-être expliquer comment d'énumérer les poignées dans le processus et de trouver celui qui concerne le nom de fichier?