2011-03-17 20 views
6

Kendiniz deneyin:CreateFile, FILE_SHARE_READ ile nasıl başarısız olur ve FILE_SHARE_READ ile başarılı olabilir? FILE_SHARE_WRITE | FILE_SHARE_DELETE?

Bir XLS dosyası oluşturun, Excel'de açın.

Sistem Monitörü'nü açın ve explorer'da XLS dosyanızın bir kopyasını oluştururken ne olduğunu izleyin (sadece ctrl-c ctrl-v komutunu kullanın).

Üst üste iki çağrı ::CreateProcess. İlk arama, okuma izinlerini sorar ve Access reddedilir. İkinci çağrı, okuma artı yazma ve silme ve geçişleri sorar.

Bu normal mi?

cevap

11

FILE_SHARE_READ numaralı bir dosyayı açarsanız, bu dosyaya yalnızca paylaşım için erişim paylaşmaya hazır olduğunuzu söylüyorsunuz.

Tüm bayraklarla açılırsanız, yazma/silme için de erişimi paylaşmaya hazırsınız. başka bir işlem (Excel) örneğin açılan bu dosya varsa

FILE_SHARE_READFILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE

daha kısıtlayıcı yazmak (ve paylaşma bayraklarını ayarladı), erişebilmenin tek yolu yazma için paylaşmayı kabul etmektir.

3

Uyumlu paylaşım modlarını kullanmanız gerekir. Excel dosyayı FILE_SHARE_READ ile açarsa | FILE_SHARE_WRITE sonra dosyayı açmak için sonraki girişimleri en az aynı bayraklarını kullanmalıdır. Özellikle MSDN documentation on CreateFile dan:

Sen açık tanıtıcı varolan istek belirtilen erişim modu ile çakışan bir paylaşım modu isteğinde bulunamaz. CreateFile başarısız olur ve GetLastError işlevi, ERROR_SHARING_VIOLATION değerini döndürür.

İlgili konular