2014-01-21 38 views
5

Gibt es eine Möglichkeit in C++ zu erkennen, ob eine Datei in einem anderen Programm bereits geöffnet ist ?.
Ich möchte einige Dateien löschen und neu schreiben, aber für den Fall, dass eine Datei geöffnet wird, möchte ich eine Fehlermeldung anzeigen. Ich benutze Windows OS.Erkennen, ob Datei in C++ geöffnet ist

+1

Eine ähnliche Frage gestellt wurde und beantwortet vor: https://stackoverflow.com/questions/13691603/whats-a-programmatic-way-to-detect-if-a- file-is-opened-in-windows? rq = 1 – jpw

Antwort

10

einer Aktion auf dem Ergebnis der Abhängigkeit „Datei öffnen Abfrage ist“ ist eine Race-Bedingung (die Abfrage false und dann öffnet sich ein Programm die Datei, bevor Ihr Programm versucht, es zum Beispiel zu löschen) .

Es wurde versucht, die Datei mit DeleteFile() zu löschen, und wenn dies fehlschlägt, zeigen Sie den Grund für das Löschen der Datei an, indem Sie GetLastError() verwenden. Siehe System Error Codes für die Liste der Fehlercodes (ERROR_SHARING_VIOLATION der heißt es: „Der Prozess kann nicht auf die Datei zugreifen kann, weil sie von einem anderen Prozess verwendet wird.“)

+0

Unter welchen Bedingungen kann eine Datei von einem Programm geöffnet werden, wenn ich es nicht selbst öffne? Es ist ein bisschen verwirrend für mich. Kannst du mir bitte ein paar Beispiele geben? – AlexandraC

+0

@AlexandraC, ich bin unsicher, was du meinst "wenn ich es nicht selbst öffne"? Wenn eine Datei existiert, kann jedes Programm versuchen, es zu öffnen, wenn es will. Ein sinnvolles Beispiel wäre ein Viren-Checker, der regelmäßig Dateien öffnen kann, um den Inhalt zu untersuchen. – hmjd

+0

danke für die Antwort, es ist sehr hilfreich. Ich wollte wissen, warum ein Programm eine Datei öffnen möchte. Gibt es Unterlagen, in denen ich mehr über dieses Thema lesen kann? – 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

... und dann ein anderer Prozess öffnet die Datei zwischen dem 'close' und Ihrem Versuch, es zu entfernen ... – molbdnilo

+0

@molbdnilo: Ich habe nicht genau verstanden. Geht es um die Synchronisierung des Zugriffs auf die Datei durch zwei Prozesse? – CreativeMind

+0

Ja, siehe die Antwort von hmjd. Ihr Test ist sinnlos, da er später jederzeit ungültig werden kann. (Angenommen, ein präemptives Multitasking-Betriebssystem.) – molbdnilo

0

können Sie is_open() verwenden, um zu überprüfen, ob die Datei geöffnet ist. Wenn es ist, können Sie es schließen oder etwas anderes tun. Hier ist ein 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

Dies würde nicht prüfen, ob die Datei in anderen Programmen geöffnet ist, nur ob es Ihnen gelungen ist, sie für sich selbst zu öffnen. – zenzelezz

Verwandte Themen