SORUN: CreateFile işlevi başarısız olduğunda ERROR_SHARING_VIOLATION hata iletisi

Makale çevirileri Makale çevirileri
Makale numarası: 316609 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Belirtiler

FILE_SHARE_READ bayrağı FILE_SHARE_WRITE bayrağı ile bir dosyayı açtığınızda, CreateFile işlevi başarısız ve aşağıdaki hata iletisini döndürür:
<a1>ERROR_SHARING_VIOLATION</a1> (hata kodu: 32)

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

CreateFile</a0> işlevini veya CreateFile dahili olarak kullanır, herhangi bir işlevini kullanarak bir dosyayı açtığınızda, bir paylaşım ihlalinden dolayı beklenmeyen bir başarısızlık karşılaşabilirsiniz. Dosyayı yalnızca belirli bir uygulama için bile, dosya aynı anda erişmeye çalışabilir olabilecek diğer işlemleri vardır. Genel sistem bileşenlerinin ve ayrıca bu soruna neden olan diğer üçüncü taraf uygulamalar vardır. Genel sistem bileşenlerinin ve ayrıca üçüncü taraf uygulamalar vardır (virüs tarama gibi yazılım) neden olan sorun.

Microsoft Windows işletim sisteminin aynı anda çalışan birçok uygulama görünümünü sağlayan bir preemptive, çoklu işlem sistemidir. Herhangi bir uygulama "bilgisi", sistemi üzerinde çalışan tek bir işlem olduğunu değil ve bu kaynaklara başka işlemler için vying emin olmanız gerekir. Kaynak işlenmesi nedeniyle oluşan sorunları ele gerekir. Dosyaları durumunda, herhangi bir çalışan işlemi, kaynak kullanmaya hakkına sahiptir. Var. her zaman sistem bileşenleri ve kaynakları için aynı anda rekabet üçüncü taraf hizmetleri Bir uygulama, uygulama diğer işlemlerle competes sistemindeki dosyalara erişmeye çalıştığında.

Bir ERROR_SHARING_VIOLATION yaygın iki nedeni vardır:
  • Belirli bir dosya (paylaşılan veri ortak dosyalar) diskte kullanan birden çok uygulama vardır. Bir uygulama, ikinci bir uygulama, aynı dosyaya erişmeye biçimi ile uyumlu olmayan bir şekilde dosya şu anda erişiyor. Örneğin, dosya güncelleştirmek isteyebilirsiniz, ancak başka bir işlem şu anda dosyaya yazma ve (FILE_SHARE_READ) okumak için dosyayı yalnızca paylaşıyor.
  • Uygulamanız için belirli bir veri dosyası dosyasıdır ve dosyayı açmak için başka bir uygulama beklediğiniz. Bu senaryoda, diğer işlemler bir dosyayı başka bir nedenle kısa bir süre için kilitleme.
En yaygın sorun, bir hizmet programı, bir virüs tarayıcısı, yedekleme yazılımı ya da kısa bir süre için diskteki bir dosyaya kilitler, bir disk iyileştirici oluşur. Başka bir uygulama bile tüm açık paylaşımı ile dosyayı açmaya çalıştığında, bir paylaşım ihlali ile deneme başarısız. Hizmet, dosya işlemi süresince özel kullanım erişiminiz olması gerekir, çünkü bu sonucu bekleyebilirsiniz. Bu sorunu gidermek için <a0></a0>, kısa bir süre daha sonra deneyin. Genellikle, hizmetin bir konular milisaniye dosyayla tamamlanır.

Iki nedeni, daha önce açıklanan ihlallerini paylaşmak için aynı şekilde ele alınması gerekir. Bir dosyayı açtığınızda, böylece değil sistemin kullanıcı etkiler veya sistemin çökmesine neden, her zaman bir paylaşım ihlali düzgün bir şekilde işlemesi gerekir. Bir basit bir yeniden deneme düzeneğini kullanarak bunu yapabilirsiniz. Dosya kilidi önce birden çok yeniden deneme yapmak gerekebilir.

Aşağıdaki kod örneği, bu teknik gösterilmiştir:
#define MAXRETRIES  5
#define RETRYDELAY  250

HANDLE  hFile     = INVALID_HANDLE_VALUE
DWORD   dwRetries = 0;
BOOL    bSuccess  = FALSE;
DWORD   dwErr     = 0;

do
{
    hFile = CreateFile( szFile,
                        GENERIC_READ,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
    if ( INVALID_HANDLE_VALUE == hFile )
    {
        dwErr = GetLastError();

        if ( ERROR_SHARING_VIOLATION == dwErr )
        {
            dwRetries += 1;
            Sleep(RETRYDELAY);
            continue;
        }
        else
        {
            // An error occurred.
            break;
        }
    }

    bSuccess = TRUE;
    break;
} while ( dwRetries < MAXRETRIES );

if  ( bSuccess )
{
    // You succeeded in opening the file.
}
else
{
    // Failure occurs. Do graceful error handling.

    // Here, you must notify the user of the failure.

MessageBox( NULL,
            "Tried to update data file but it was already in use",
            "Update error...",
            MB_OK | MB_ICONSTOP );

    // You also want to put the software back in the state it was in
    // on entrance of the current function, as if the user had never
    // tried to do the update.

    // This may also require deallocating any resources that were
    // allocated because of this operation.
}
				
tamamlanması zaman dosyayı içeren bir uygulama düzgün biçimde paylaşım ihlali hatası işlemek için bu yöntem sağlar. Paylaşım ihlali hatası alıyorsunuz her zaman için bir süre uyku uygulamaya izin ve gerekir sonra yeniden deneyin. Bir virüs tarayıcısı veya bir sistem hizmeti, dosya açarken, virüs tarayıcısı veya sistem hizmeti bir veya iki denemeden sonra bitiş. Sonsuz bir döngüye önlemek için yeniden deneme sınırı olmasına dikkat edin. Başka bir uygulama şu anda açık dosya (ve dosya açık uzun bir süredir tutmak), kullanıcı tarafından döngü kesiliyor konusunda bilgilendirmek ve sonra dikkatlice çıkın.

Özellikler

Makale numarası: 316609 - Last Review: 21 Kasım 2006 Salı - Gözden geçirme: 1.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi
Anahtar Kelimeler: 
kbmt kbfileio kbkernbase kbprb KB316609 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:316609
Kullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com