Proste pytanie:Operacje na plikach C: Sprawdź tryb dostępu do wskaźnika otwartych plików
Jak sprawdzić tryb dostępu już otwartego wskaźnika pliku?
Tak mówią funkcja jest zdany już otwarty wskaźnik pliku:
//Pseudo code
bool PseudoFunction(FILE *Ptr)
{
if(... Insert check for read-only access rights)
{
//It's read only access mode
return true;
}
//File pointer is not read-only and thus write operations are permitted
return false;
}
Co chciałbym użyć w instrukcji if, aby sprawdzić wskaźnik pliku został otwarty tylko do odczytu (lub nie, jak w przypadku może być), bez zapisywania do pliku i bez polegania na przekazywaniu (ewentualnie sprzecznych) argumentów przez użytkownika?
System to Windows, kod :: blokuje kompilator, ale w interesie przenoszenia kodu preferowana jest kompatybilność krzyżowa.
Uwaga, to nie pyta o prawa do plików, ale jaki tryb dostępu został użyty przez wskaźnik PLIK.
SELF-ODPOWIEDŹ [Nie można dołączyć osobną odpowiedź ze względu na ograniczenia praw użytkowników]:
Jest lepsza odpowiedź innym plakacie poniżej, który zawiera odpowiednie #defines
Jak wcześniej sugerowane , wygląda na to, że znacznik PLIKU _flag (zdefiniowany pod _iobuf) jest kluczem do ustalenia, czy plik jest tylko do odczytu. Może się wahać chociaż, ale te same podstawowe pojęcia powinny być łatwo dostosować, przykładowy kod:
#define READ_ONLY_FLAG 1
bool PrintFlagPtr(const char FileName[], const char AccessMode[])
{
FILE *Ptr = NULL;
Ptr = fopen(FileName,AccessMode);
printf("%s: %d ",AccessMode,Ptr->_flag);
int IsReadOnly = Ptr->_flag;
fclose(Ptr);
Ptr = NULL;
if((IsReadOnly&READ_ONLY_FLAG) == READ_ONLY_FLAG)
{
printf("File is read only!\n");
return true;
}
printf("\n");
return false;
}
, że gdy wszystkie różne kombinacje tryb dostępu stosowane są z powyższej funkcji, produkuje moc:
Output:
w: 2
r: 1 File is read only!
a: 2
wb: 2
rb: 1 File is read only!
ab: 2
w+: 128
r+: 128
a+: 128
w+b: 128
r+b: 128
a+b: 128
Jestem ciekawy, dlaczego nigdy nie zostało to zasugerowane (lub nigdy nie było używane), biorąc pod uwagę kompatybilność krzyżową funkcji front-end (po prostu funkcja o tej samej nazwie, z deklaracjami zależnymi od platformy) przekazującą const int pochodzącą z dany wskaźnik FILE _flag byłby dość prostym i łatwym rozwiązaniem problemu.
Unikaj używania wyroczni, aby odkryć coś, co jest dobrze znane w twoim programie. Jakiś kod tworzy PLIK, ten kod również wie, * jak * został utworzony. Dodaj argument do swojej funkcji. –
Faktycznie, poleganie na tym, aby użytkownik poinformował nas, jakie prawa dostępu ma plik, jest nieprawidłowy (jak podano), ponieważ jest to luka w zabezpieczeniach. I to jest programowanie, a nie prognozy - część kodu już wie, jakie prawa dostępu są, aby móc popełnić błąd podczas używania poleceń putc i podobnych. – SSight3
Nie mam pojęcia, dlaczego uważasz, że użytkownik ma coś z tym wspólnego. Wymaga od programisty C przekazywania argumentów do funkcji. Jeśli nie ufasz programistom, wszystkie zakłady są wyłączone. –