|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2006
Messaggi: 69
|
[C] Trovare il nome del file dal puntatore FILE
Ciao, avendo un puntatore ad una struttura FILE come è possibile recuperare il nome del file?
Ovviamente il file lo apre un'altro programma con la funzione fopen. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Fammi capire...il programma A apre un file, e il programma B deve capire (dal puntatore FILE * di A) di che file si tratta?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Codice:
#define STRING_LENGHT 256
typedef struct FileStruct_t {
char filename[STRING_LENGTH];
FILE *fp;
} FileStruct;
...
FileStruct file;
strncpy(file.filename, "nome_del_file.ext", STRING_LENGTH);
file.fp = fopen(...);
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson Ultima modifica di -fidel- : 24-10-2006 alle 16:23. |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Se non ho capito male però, uReverendo parla di "un'altro programma", il che complica le cose...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Sotto UNIX: Utilizzando la fileno () ti puoi far ritornare il descrittore (come se avessi aperto il file con la open()). Dopo di che puoi usare la fstat() per ottenere l'i-node. Il passaggio da i-node a nome file non dovrebbe essere difficile. E' piu' facile se conosci la directory in cui il file risiede, ovviamente. Sotto Windows: Mi piacerebbe proprio saperlo. Il processo di cui sopra non e' applicabile Spero in nell'intervento di qualcuno piu' preparato, visto che e' un problema interessante (soprattutto in caso di debug di codice altrui che si dimentica di chiudere una risma di file...)
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 24-10-2006 alle 16:29. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
In windows ci sarebbe la GetModuleFilename, credo funzioni anche con i file, ma comunque vuole un HANDLE come paramentro, non un puntatore di tipo FILE, per questo non l'ho proposta.
Per linux anch'io conosco un metodo, ma si basa appunto sulle tabelle del SO, quindi non è portabile...
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
#9 | ||
|
Member
Iscritto dal: May 2006
Messaggi: 69
|
Quote:
Quote:
|
||
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
E comunque, in generale, un programma non ci fa niente con il puntatore FILE * di un altro programma. Si può tentare di aggirare anche questo ostacolo, ma si entra ancor più nel complicato e s/o-dipendente.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Su linux anche io avrei una idea, magari stupida: dato il descrittore e il PID, andare in /proc/<num PID>/fd e vedere a cosa corrisponde il link che ha il numero del descrittore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: May 2006
Messaggi: 69
|
Per chiarirci l'applicazione che apre il file non l'ho scritta io (le sto facendo un debug). Inoltre lavoro su win2000.
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Purtroppo il problema e' da risolvere su win 2000, e su questa piattaforma mi sembra un problemone. Buona notte a tutti High Flying Sottovento
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: May 2006
Messaggi: 69
|
Quote:
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Forse puoi ricavarti gli HANDLE aperti dal processo...fidel?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
L'Handle al processo la si ricava facilmente, ad esempio con una EnumProcesses(), seguita da una OpenProcess() EDIT: ancora meglio!! C'è una bella funzione che si chiama GetMappedFileName(). Basta passare come parametro l'Handle al processo in questione e l'indirizzo da verificare, e se questo si riferisce ad un file caricato dal processo (quindi già aperto), copia in un buffer (passato sempre come parametro) il nome del file. La descrizione completa è qui ad esempio: http://msdn.microsoft.com/library/de...edfilename.asp
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson Ultima modifica di -fidel- : 24-10-2006 alle 17:17. |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Purtroppo non elenca alcun handle riferito ad un file aperto... Stavo pensando di usare i performance object, ma psapi fornisce le stesse funzionalità (per questo non li uso da secoli). Magari in quel modo si ricava qualcosa, ma dubito. E' un grosso problema questo...
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:24.



















