2014-01-21 82 views
5

C++中有沒有任何方法檢測文件是否已經在另一個程序中打開?
我想刪除並重寫一些文件,但是如果文件被打開,我想顯示一條錯誤消息。我正在使用Windows操作系統。檢測文件是否在C++中打開

+1

類似的問題已經被提出和回答之前:https://stackoverflow.com/questions/13691603/whats-a-programmatic-way-to-detect-if-a-文件打開在Windows?rq = 1 – jpw

回答

10

以視的結果的行動「是打開文件的查詢」是一個競爭條件(該查詢返回false然後用一個程序打開該文件的程序試圖刪除例如之前) 。

嘗試使用DeleteFile()刪除文件,如果失敗,則使用GetLastError()顯示文件刪除失敗的原因。見System Error Codes的錯誤代碼列表(ERROR_SHARING_VIOLATION其中規定「因爲它正在使用由另一個進程的進程無法訪問該文件。」

+0

如果我自己沒有打開文件,程序可以在什麼條件下打開文件?這對我來說有點困惑。你能給我舉一些例子嗎? – AlexandraC

+0

@AlexandraC,我不確定你的意思是「如果我自己沒有打開它」?如果文件存在,任何程序都可以嘗試打開它,如果需要的話。一個明智的例子是病毒檢查器,它可以定期打開文件來檢查內容。 – hmjd

+0

感謝您的回答,這是非常有幫助的。我想知道爲什麼程序想打開一個文件。是否有任何文檔可以閱讀關於此主題的更多信息? – AlexandraC

0
#include <iostream>  // std::cout 
#include <fstream>  // std::ofstream 

int main() { 
    std::ofstream ofs; 
    ofs.open ("example.txt"); 
    if (ofs.is_open()) 
    { 
    ofs << "anything"; 
    std::cout << "operation successfully performed\n"; 
    ofs.close(); 
    } 
    else 
    { 
    std::cout << "Error opening file"; 
    } 
    return 0; 
} 
+0

...然後一些其他進程打開文件之間的'關閉'和你試圖刪除它... – molbdnilo

+0

@molbdnilo:我不明白。是通過兩個進程訪問文件的同步嗎? – CreativeMind

+0

是的,請參閱hmjd的答案。這是沒有意義的,因爲在隨後的任何時候它都可能失效。 (假設先發制人的多任務操作系統。) – molbdnilo

0

您可以使用is_open()來檢查文件是否打開。如果是這樣,你可以關閉它或做其他事情。 這裏是一個exampe:

int main() 
{ 

    fstream filestr; 
    filestr.open ("test.txt"); 

    if (filestr.is_open()) 
    { 

    filestr << "File successfully open"; 
    filestr.close(); 

    } 

    else 
    { 

    cout << "Error opening file"; 

    } 

return 0; 
} 
+2

這不會檢查文件是否在其他程序中打開,只是您是否成功打開了它。 – zenzelezz