2010-11-30 18 views
7

Şu anda WriteFile numaralı çağrıya (veya daha doğrusu, CFile :: Write - ancak sadece WriteFile içsel olarak adlandırılan) bir çağrıya sorun yaşıyoruz ve bu da Win32 hatasına neden oluyor: 5ERROR_ACCESS_DENIED.WriteFile'ın ERROR_ACCESS_DENIED değerini döndürmesine neden olan nedir?

(Düzeltme:.! Biz davranışı Repro unutmayın Şu anda elimizdeki tüm CFile :: Yaz oldu kaynak hattını gösteren ve hata Error_access_denıed olarak içeren bir günlük dosyası olan)

(DÜZENLEME : dosya bir yerel sürücüde olduğunu ve aslında bir dosya ve dizin değil)

Şimdi WriteFiles's documentation gerçekten yardımcı olmuyor ve basit bir test uygulama içi deneme aşağıdaki sonuçları verir:.

  1. WriteFile neden yazılır (örneğin, dosya tanıtımı için açılmayan bir dosya tanıtıcısı için çağrılırsa ERROR_ACCESS_DENIED). sadece okuma için açılır). tanıtıcı geçerli değil veya dosya dosya için hiç
  2. erişim hakları veya yazma korumalı bayrak açık değil
    • eğer
    • O değil neden Error_access_denıed olacak'dan sonra değiştirilmiştir, dosya işlem tarafından açılmıştır. (Dosyayı açmadan başarısız olur çünkü bu önce değiştirilmişse dosya açılır, o zaman WriteFile olsun asla.)
    • dosya nedense (Başka bir işlem/koldan Bu işlem en iyi sonucu yanlışlıkla 32 ERROR_SHARING_VIOLATION kilitlendi). dosyanın gerçekten okuma bayrağı yerine yazma bayrağıyla açılmışsa görünüşte bu çağrı için tek olasılık başarısız duruma, bize bırakıyor

. Ancak, bizim kodumuza baktığımızda, bu son derece düşük gibi görünüyor. (Nedeniyle bizim izleme, biz WriteFile başarısız olduğundan emin olabilir ve bunlar dışarı takip edilmez çünkü biz hata Error_access_denıed olduğundan emin olabiliriz, biz, açılış bayrakları 100.1% emin olamaz.)

WriteFile'ın (CFile :: Write) bir ERROR_ACCESS_DENIED neden olacağı bilinen başka bir durum var mı?

Not:

  • dosya ı gerçekleştirilen
  • Tüm testler süre göstermektedir bu nedenle bir dizin olabilir ya da bloklarýnýn olamaz açık edildi: ayrıca bu sorunun bağlamını netleştirmek için Dosya açık değil, silinemez, bu yüzden dosya hala orada WriteFile
  • çağrı vardı olmalıdır Dosya bir yerel sürücüde bulunan ve bir ağ sürücüsünde değil.

Biz Windows XP SP3 çalıştırdığınız ve bunu debug yapmanız gerekir eğer uygulama Visual Studio 2005

+1

neden açılış bayraklarını izleyemiyorsa? Kodu düzenlemek istemiyorsanız, bunları denetlemek için yalnızca işlem izleyicisini kullanın. –

+0

Elbette izleme ekleyebiliriz. Bu sadece bir zamanlar müşteri sitesinde olur. Orada bir hata ayıklayıcı ekleyemeyiz. –

+1

Dosya sistemi filtre sürücüleri buna da neden olabilir, en belirgin örnek anti-virüs tarayıcılarıdır (şifreleme gibi başka şeyler de olsa). – Luke

cevap

3

soru

ERROR_ACCESS_DENIED dönmek için WriteFile neden ne

oldu?

ve (yani sadece okuma için açılır) yazmak için açılmaz bir dosya tanıtıcısı için denir eğer

  1. WriteFile ERROR_ACCESS_DENIED neden olacaktır Söz konusu belirtti .

açık bayrakları ve başka olay için daha ileri günlüğü ekledikten sonra, bu doğruydu çıkıyor. Açık bayrakların günlüğe kaydedilmesi, hata noktasında, dosya nesnesinin CFile :: modeRead ile açıldığını ve dolayısıyla ERROR_ACCESS_DENIED olduğunu gösterir.

Henüz hangi tuhaf kod yolunun buna yol açtığını henüz anlamadım, ancak bu şu anlama geliyor: Kendi kodunuza asla güvenmeyin. :-)

(Oh ve Btw. Bu başarısız ::WriteFile değildi ama ::FlushFileBuffers API ama görünüşe göre aynı hata verir.)

+0

Bu, kendi sorunuzu cevapladıysa, lütfen bunu işaretleyin. – RedX

+0

@RedX: Teşekkürler. Bunu hemen yapmadım çünkü kendi cevaplarının belli bir süre için kilitlendiğini düşündüm. Bu sorunun cevabı için değil, sorunun yaşına uygulanır. –

0

ile derlenmiş olduğunu eklemek gerekir. o bir milyon şey olabilir:

  • msdn yanlıştır
  • bazı uygulama (? virüsü) WriteFile takma ve farklı bir davranış
  • dosya sistemi soruna neden olan (bunu çok olur)?
  • sizin loglamasına yanlış bir şey, ya da gözlemler
+2

IMHO, bu bir yorum olmalıydı.Sorunun hata ayıklanması şu anda mümkün değildir. –

1

ERROR_ACCESS_DENIED ile sonuçlanabilecek yaklaşık bir düzine farklı durum var. Dahili olarak, tüm WriteFile NtWriteFile çağırır ve (biraz anlamlı) NTSTATUS hata kodunu daha az anlamlı bir HRESULT içine eşleyin.

Diğer şeylerin yanı sıra, ERROR_ACCESS_DENIED dosyanın bir ağ biriminde olduğunu ve yazma izinleri ile yanlış bir şey olduğunu veya dosyanın gerçekten bir dosya değil bir dizin olduğunu gösterebilir.

+0

Dosya bir ağ volumje değil ve aslında bir dosyadır. –

İlgili konular