PRB: ERROR_SHARING_VIOLATION 時,出現錯誤訊息 CreateFile 函式失敗

文章翻譯 文章翻譯
文章編號: 316609 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

徵狀

當以 FILE_SHARE_READ 旗標和 FILE_SHARE_WRITE 旗標開啟檔案時,CreateFile 函式可能會失敗,且傳回下列錯誤訊息:
ERROR_SHARING_VIOLATION (錯誤碼 32)

狀況說明

這種行為是經過設計規劃的。

其他相關資訊

當您使用 CreateFile 函式或在內部使用 CreateFile 任何函式來開啟檔案時,您可能會遇到未預期的失敗由於違反共用。即使是只針對特定的應用程式檔案,有也可能會嘗試在同一時間存取該檔案可能其他處理程序。有一些常見的系統元件和也會造成這個問題的其他協力廠商應用程式。有一些常見的系統元件和也協力廠商應用程式 (例如病毒掃描軟體),會造成這個問題。

Microsoft Windows 作業系統是先佔式,多重處理系統,讓許多同時執行的應用程式的外觀。任何特定的應用程式必須 「 知道 」 不是唯一的處理程序在系統上執行,且競逐資源與其他處理程序。必須加以處理,可能發生的原因是資源的處理方式的問題。檔案的情況下任何執行中的處理程序會有權試著使用該資源。總是會有系統元件和同時爭奪資源的協力廠商服務。當應用程式嘗試存取之應用程式與其他處理序 competes 系統上的檔案。

有一個 ERROR_SHARING_VIOLATION 的兩個常見的原因:
  • 有使用特定的檔案磁碟 (常見的共用的資料檔案) 上的多個應用程式。應用程式目前正在存取,第二個應用程式嘗試存取相同檔案的方式與不相容的檔案。比方說您可能想要更新該檔案但另一個處理序目前寫入至檔案和只共用的讀取 (FILE_SHARE_READ) 檔。
  • 這個檔案的應用程式的特定的資料檔案,以及不要指望另一個應用程式會有開啟的檔案。在這種情況下其他處理程序可能會鎖定檔案進行短的持續期間,因為其他原因。
當如病毒掃描程式、 備份軟體或一個磁碟] 最佳化器的鎖定檔案在磁碟上的一小段時間一個公用程式時,就會發生最常見的問題。當另一個應用程式嘗試即使有了完整共用已開啟) 中開啟該檔案時,嘗試失敗與共用違規。因為服務必須有獨佔存取檔案上作業的持續期間,您可以預期這個結果。如果要解決這個問題,試一次一小段時間。經常,服務完成與檔案在幾毫秒為單位)。

同樣地必須處理兩個共用違規稍早所述的原因。當您開啟檔案時,您必須永遠處理共用違規非失誤性的方式,讓您執行不會影響系統的使用者或導致損毀的系統。您可以如此做,請使用簡單的重試機制。您可能必須執行多次重試之前檔案已解除鎖定。

下列程式碼範例示範這項技術:
#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.
}
				
正常方式處理共用違規錯誤的這個方法可讓已開啟的時間來完成檔案的應用程式。每次收到共用違規錯誤您必須允許應用程式以 睡眠 一段,然後再試一次。如果病毒掃描程式或系統服務具有開啟檔案、 病毒掃描程式或系統服務可能會在一或兩個重試次數之後完成。請確定您限制重試次數避免發生無限迴圈。如果另一個應用程式目前已開啟的檔案 (並可能保持檔案開啟一段很長的時間),告知使用者藉由中斷的迴圈,並依正常程序結束。

屬性

文章編號: 316609 - 上次校閱: 2006年11月21日 - 版次: 1.2
這篇文章中的資訊適用於:
  • Microsoft Win32 Application Programming Interface
關鍵字:?
kbmt kbfileio kbkernbase kbprb KB316609 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:316609
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

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