Also, was Sie wirklich wollen, ist eine Datei-Deskriptor gegeben werden, und grundsätzlich die gleiche Datei wieder öffnen, um eine separate Position, Freigabe, Modus usw. zu erhalten. Und Sie möchten dies unter Windows tun (wo der „Dateideskriptor“ ist im Grunde ein Fremdkörper, nicht etwas, direkt durch das O oder die Laufzeitbibliothek an allen
Erstaunlicherweise verwendet. es ist eine Art und Weise, dass zumindest mit MS zu tun VC++: Alle bis auf zwei Schritte verwenden nur die Win32-API, daher sollte die Portierung auf andere Compiler/Bibliotheken ziemlich vernünftig sein (ich denke, die meisten Versionsversionen dieser beiden Funktionen) .Diese dienen zum Konvertieren eines Unix-Style-Dateideskriptors in ein natives Win3 2 Dateizugriffsnummer und Konvertierung eines systemeigenen Win32-Dateihandle zurück in einen Unix-Style-Dateideskriptor.
- konvertieren Datei-Descriptor nativen Datei-Handle mit _get_osfhandle()
- einen Namen ein neues Handle für diese Datei zu öffnen
mit GetFileInformationByHandleEx (FILE_NAME_INFO)
- Verwenden Createfile für die Datei Get
- erstellen Sie einen Dateideskriptor für das mit _open_osfhandle Griff()
Et voilà, haben wir eine neue Dateideskriptors verweisen klingeln auf die gleiche Datei, aber mit eigenen Berechtigungen, Position, etc.
Gegen Ende Ihrer Frage, Sie es klingen wie Sie wollen auch die "Berechtigungen", aber das scheint nicht real zu machen Sinn: Die Berechtigungen werden an die Datei selbst angehängt, nicht an die Art und Weise, wie die Datei geöffnet wird. Daher hat das Öffnen oder erneute Öffnen der Datei keine Auswirkungen auf die Dateiberechtigungen. Wenn Sie das wirklich wissen wollen, können Sie es mit GetFileInformationByHandle bekommen, aber seien Sie sich bewusst, dass die Dateiberechtigungen in Windows ziemlich verschieden von den (traditionellen) Dateiberechtigungen in Unix sind. Unix hat Besitzer-/Gruppen-/Weltberechtigungen für alle Dateien, und die meisten Systeme haben auch Zugriffssteuerungslisten (obwohl es mehr Unterschiede gibt, wie sie funktionieren). Windows hat entweder überhaupt keine Berechtigungen (z. B. Dateien auf FAT oder FAT32) oder verwendet ACLs (z. B. Dateien auf NTFS), aber nichts, das den traditionellen Eigentümer-/Gruppen-/Weltberechtigungen entspricht, die die meisten Benutzer unter Unix gewohnt sind.
Vielleicht verwenden Sie "Berechtigungen", um darauf zu verweisen, ob die Datei zum Lesen, Schreiben oder für beides geöffnet war. Das zu bekommen ist wesentlich hässlicher als alle anderen. Das Problem ist, dass das meiste davon in der Bibliothek ist, nicht Win32, also gibt es wahrscheinlich keine Möglichkeit, dies zu tun, die sogar zwischen Compilern in der Nähe von portierbar ist. Mit MS VC++ 9.0 SP1 (nicht garantiert für jeder andere Compiler) Sie können dies tun:
#include <stdio.h>
int get_perms(int fd) {
int i;
FILE * base = __iob_func();
for (i=0; i<_IOB_ENTRIES; i++)
if (base[i]._file == fd)
return base[i]._flag; // we've found our file
return 0; // file wasn't found.
}
Da dies einige Spelunking beteiligt, schrieb ich einen schnellen Test zu überprüfen, ob es könnte tatsächlich funktionieren:
#ifdef TEST
#include <io.h>
void show_perms(int perms, char const *caption) {
printf("File opened for %s\n", caption);
printf("Read permission = %d\n", (perms & _IOREAD)!=0);
printf("Write permission = %d\n", (perms & _IOWRT)!=0);
}
int main(int argc, char **argv) {
FILE *file1, *file2;
int perms1, perms2;
file1=fopen(argv[1], "w");
perms1 = get_perms(_fileno(file1));
fclose(file1);
file2=fopen(argv[1], "r");
perms2 = get_perms(_fileno(file2));
fclose(file2);
show_perms(perms1, "writing");
show_perms(perms2, "reading");
return 0;
}
#endif
und die Ergebnisse scheinen zeigen Erfolg:
File opened for writing
Read permission = 0
Write permission = 1
File opened for reading
Read permission = 1
Write permission = 0
Sie können dann Test, der Flagge gegen _IOREAD, _IOWRT zurückgekehrt und _IORW, das sind definiert in stdio.h. Trotz meiner früheren Warnungen sollte ich wahrscheinlich darauf hinweisen, dass ich (obwohl ich sicherlich nicht garantieren kann) vermute, dass dieser Teil der Bibliothek ziemlich stabil ist, so dass die wahren Chancen für größere Veränderungen wahrscheinlich ziemlich gering sind.
In der anderen Richtung gibt es jedoch im Grunde keine Chance überhaupt, dass es mit jeder anderen Bibliothek arbeiten wird. Es könnte (aber ist sicherlich nicht garantiert) mit den anderen Compilern arbeiten, die die MS-Bibliothek verwenden, wie Intel, MinGW oder Comeau mit MS VC++ als Back-End. Von diesen würde ich sagen, dass Comeau am wahrscheinlichsten arbeiten würde, und das am wenigsten wahrscheinliche MinGW (aber das ist nur eine Vermutung; es gibt eine gute Chance, dass es mit keinem von ihnen funktionieren wird).
- Erfordert das verteilbare Win32 FileID API Library
eine gute Antwort. Mir war nicht bewusst, dass das Öffnen einer Datei verhinderte, dass die Verknüpfung aufgehoben oder umbenannt wurde, selbst wenn die vollständige Freigabe aktiviert war. Dies bedeutet, dass das Abrufen des Dateinamens, der zu einem Handle gehört, vollkommen sicher ist, da er sich nicht ändern kann, solange ein Dateideskriptor oder 'HANDLE' für diesen Pfad offen bleibt. –
Wie kann ich das Gleiche unter Linux tun? danke – alaamh
@alaamh: hast du die anderen Antworten durchgesehen? Ein paar von ihnen reden darüber, wie man die gleichen Dinge unter Linux macht. –