2011-08-11 10 views
5

mı?C Dosya İşlemleri:</p> <p>nasıl zaten açılmış dosya içinde erişim modunu kontrol ederim: Basit bir soru açılan dosya işaretçisi erişim modunu

Yani bir işlev zaten açılmış DOSYA işaretçi geçirilir ki:

//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; 
    } 

ben açılmıştı DOSYA işaretçisi kontrol etmek eğer açıklamada kullanmak hangi salt okunur (ya da değil, duruma göre olabilir), dosyaya yazmadan ve kullanıcı (muhtemelen çelişkili) argümanlara güvenmeden mi?

Sistem pencereler, kod :: derleyicileri engeller, ancak kod taşınabilirliği ilgi alanları için çapraz uyumluluk tercih edilir.

Not, bu dosya hakları hakkında bilgi istemez, ancak FILE işaretçisi tarafından hangi erişim modu kullanılmıştır.

KENDİNİ CEVAP [dolayı kullanıcı hakları sınırlamalara ayrı cevap eklenemez]:

o önceki gibi

önerilen uygun #DEFINEs içerir altında başka bir afiş daha iyi bir yanıt var , DOSYA işaretçisinin _flag (_iobuf altında tanımlandığı gibi), bir dosyanın salt okunur olup olmadığını bilmenin anahtarıdır. İşletme mil da değişebilir, ancak, aynı temel kavramı kolayca adapte olmalıdır, örneğin, kod:

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 
: tüm farklı erişim modu birlesimlerini fonksiyonu ile kullanıldığında, bir çıktı ürettiği ortaya

#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; 
} 

Çapraz-uyumlu bir ön uç işlevi (platformla ilgili bildirimlerle aynı adı taşıyan bir işlev) elde edilen bir const int geçiren bir çapraz-uyumlu ön uç işlevi göz önüne alındığında, bunun neden (ya da hiçbir zaman kullanılmadığı) önerilmediğini merak ediyorum. DOSYA işaretçisi _flag verilen sorun için oldukça basit ve kolay bir çözüm olurdu.

+0

Programınızda bilinen bir şeyi keşfetmek için bir Oracle kullanmaktan kaçının. Bazı kodlar DOSYAYI oluşturdu, bu kod da * nasıl * yaratıldığını bilir. İşlevinize bir argüman ekleyin. –

+0

Aslında, kullanıcının bir dosyada hangi erişim haklarına sahip olduğunu bize bildirmek için güvenerek (belirtildiği gibi) bu bir güvenlik açığıdır. Ve bu, tahminler değil, programlamadır - kodun bir kısmı, putc ve benzer komutları kullanırken hata yapabilmek için erişim haklarının ne olduğunu zaten biliyor. – SSight3

+0

Kullanıcıların neden bununla bir ilgisi olduğunu düşündüğünüz hakkında bir fikriniz yok. Argümanları bir işleve iletmek için bir C programcısı gerektirir. Programcıya güvenmiyorsanız, tüm bahisler kapalıdır. –

cevap

2

Uyarı: Bu yanıt Visual Studio 2010.


stdion özgüdür.Visual Studio 2010 ile birlikte gelen h dosyası aşağıdaki gibi DOSYA türünü tanımlar:

struct _iobuf { 
    char *_ptr; 
    int _cnt; 
    char *_base; 
    int _flag; 
    int _file; 
    int _charbuf; 
    int _bufsiz; 
    char *_tmpfname; 
}; 
typedef struct _iobuf FILE; 

"rb" modunda bir dosyayı fopening, bu 0x00000001 değerini alır.

#define _IOREAD   0x0001 
#define _IOWRT   0x0002 
#define _IORW   0x0080 

yatan dosyası:

r _IOREAD 
w _IOWRT 
a _IOWRT 
+ _IORW 

Bu sabitler stdio.h tanımlanmıştır: fopen fonksiyonunda

, sen interesed olduğunuz bayrakların bazıları bu şekilde eşlenebilir tanımlayıcı daha fazla bilgi içeriyor, henüz daha fazla kazmadım.

+0

Cevabınız cevabımdan daha fazla bilgi içerdiğinden (#defines kodunda bulunamadı: # bloklar [kod için çalışır :: bloklar da], ancak benzer bağlam), ben sizinkini seçeceğim.Ben sadece _file erişen bir ön uç işlevi önerisini eklemek istiyorum böylece farklı işletim sistemlerinde fonksiyon yeniden uygun olarak tanımlanabilir. Teşekkür ederim! – SSight3

1

Bunu başarmanın standart bir yolu yoktur. döndürülen değer O_RDONLY ya da benzeri bayraklarının kombinasyonu olarak bir tamsayı olduğu

int get_file_status(FILE* f) { 
    int fd = fileno(f); 
    return fcntl(fd, F_GETFL); 
} 

Not:

+0

FILE imlecinin altındaki _flag'e erişim hakkında ne düşünüyorsunuz? Şüphesiz, bu, int işaretli olarak okuma/yazma özniteliklerini içerir ve sadece bunu bulmak için herhangi bir önceden tanımlanmış numarayla karşılaştırmak zorundadır? Bunun kaşlarını çatlatabileceğinden emin olduğum halde, neden bir kuruş olarak ele alındığı ve kapaklar altında ele alındığı (ve belki de garip işlerden daha iyi) neden olmasın anlamıyorum. Programın bir DOSYA işaretçisinin yalnızca okunabileceğini (ve yazmayı reddedeceğini) bilmesi garip görünüyor, ancak programcı gelemedim. – SSight3

+1

FILE opaktır, hangi üyelerin olduğunu bilmiyorsunuz. – AProgrammer

+0

Sadece yazma sınıfı FILE {}; ve daha önce bildirilen bir DOSYA örneğinden şikayet etmek için derleyiciyi zorlamak, hangi üyelere sahip olduğunu gösterir. İyi tanımlanmış bir _iobuf sınıfı olmak, gerektiğinde her zaman çevrimiçi olabilir. – SSight3

3

Linux (ve muhtemelen tüm UNIX sistemlerinde) sitesinde dosyanın erişim modunu almak için fcntl kullanabilirsiniz O_RDWR, "r" veya "w+" dizeleri. Bu bayrakların bazıları için bkz http://pubs.opengroup.org/onlinepubs/007908799/xsh/open.html.

Windows hakkında emin değil, bkz. On Windows/mingw, what is the equivalent of `fcntl(fd, F_GETFL) | O_ACCMODE`?.

+0

Windows için bağlandığınız soru, 7 aylık görünüyor ve hiçbir yanıtı yok. – SSight3