Testen ob Datei geöffnet oder geschlossen wird



  • Hi,

    ich muss igendwie herausfinden ob eine Datei x geöffnet wurde ( z.B. durch Notepad ).
    Zur Zeit habe ich es so das ich mir eine Liste der Dateien zusammen mit dem Paramter ftLastAccess ( aus WIN32_FIND_DATA ) erstelle, dann das Verzeichnis
    alle paar Sekunden erneut durchgehe und dabei ftLastAccess der Dateien mit denen der Liste vergleiche und falls es unterschidelich ist sollte ein Zugriff auf die Datei erfolgt sein. Das könnte auch klappen nur ist ftLastAccess immer
    gleich dem Datum der letzten Änderung, also wird der letzt Zugriff der Datei erst aktualisert wenn ich die Datei z.B. in Notepad speichere.
    Ich muss aber herausfinden ob die einfach nur geöffnet wurde, das ganz ist für ein Projektmanagmentsoftware.

    thx



  • Versuchs mal mit OpenFile() und OF_SHARE_EXCLUSIVE als Style. Wenn die Datei bereits geöffnet ist, dann schlägt OpenFile() fehl. Wenn nicht, dann ist die Datei ungeöffnet und du kannst sie wieder schließen.



  • Hi,

    kannst du mir das bitte nochmal näher erläutern, ich habe bei mir folgenden Code ausprobiert :

    while(1)
       {
          OFSTRUCT info;
          HFILE hFile = OpenFile("a.txt",&info,OF_SHARE_EXCLUSIVE);
          if(hFile==HFILE_ERROR)
             cout << "opened" << endl;
          else
          {
             _lclose(hFile);
             cout << "not opened" << endl;  
          }
          Sleep(100);
       }
    

    damit verhindere ich nur das andere Anwendungen die Datei nicht mehr öffnen können, aber wenn andere sie offen haben kann ich sie auch öffnen. 😕



  • das kannst du so ziemlich vergessen, was du da vorhast 😃



  • @<->
    Was macht dich da so sicher. Wenn es unmöglich ist muss ich das ja irgendwie meinem Auftrageber klar machen.



  • Wenn ich WebFritzi richtig verstanden habe, meint er das so:
    Du öffnest die Datei mit OF_SHARE_EXCLUSIVE schlägt dies fehl, weißt du, das die Datei gerade von einem anderen Programm geöffnet ist!
    Klappt der Vorgang, weißt du, dass die Datei im Augenblick nicht geöffnet ist und kannst die Datei gleich wieder schließen (falls es nur um den Test geht)!



  • das mache ich doch bei obigem code.



  • frag deinen auftraggeber erstmal nach dem sinn der sache. wen interessiert es ob ich mit einem programm ne datei geöffnet wurde? kann man das nicht vielleicht auf ne andere art und weise lösen? es kann ja auch sein, das ein programm z.B. Notepad die Datei öffnet, einliest und sofort wieder schließt.



  • und genauso macht es auch notepad. wenn man eine textdatei öffnet kann man sie auch löschen, auch wenn sie noch in notepad dargestellt wird. das müsste heissen, das die datei sofort geschlossen wird. und deshalb funktioniert auch der code vielleicht nicht. 😞



  • Ich möchte einfach nur eine Benachrichtigung wenn die Datei geöffnet wurde.
    Das ganz ist zur statistischen Erfassung der Arbeit an einem Projekt ( dabei wird davon ausgegangen das sobald eine Datei geöffnet wurde an ihr gearbeitet wird ).
    Das ganze wäre dann so gedacht :
    Datei x geöffnet ( egal ob wieder geschlossen )
    -> mein Programm setzt ein Flag für diese Datei
    -> Datei erneut geöffnet
    -> wenn das Flag gesetzt ist soll angenommen werden die Arbeit sei beendet

    edit :
    Dumm wäre dann nur wenn man die Datei 2mal mit Notepad öffnet.
    Dann müsste ich wahrscheinlich noch die aktiven Fenster irgendwie überwachen 😕 .

    Naja, mal sehen was mein Auftraggeber dazu sagt ...

    [ Dieser Beitrag wurde am 16.11.2002 um 18:03 Uhr von Real_PsychoDAD editiert. ]

    [ Dieser Beitrag wurde am 16.11.2002 um 18:07 Uhr von Real_PsychoDAD editiert. ]



  • wenn er keine ahnung hat, dann sag ihm das es nicht möglich ist. 😃



  • Ich enttäusche ihn nur ungern 😞
    Denn was ist wenn es doch geht und er erfährt davon, dann steh ich blöd da.
    Schon alleine die Tatsache das ich mein erstes Projekt dort nicht hinbekomme bestätigt nicht gerade mein Fähigkeiten bzw. meinen Willen weiterhin für ihn zu arbeiten, mal ganz unabhängig davon ob es geht oder nicht.

    Er selbst hat vielleicht ein bisschen Ahnung, aber er hat auf jedenfall auch Kontakt zu anderen Entwicklern ...

    [ Dieser Beitrag wurde am 16.11.2002 um 18:18 Uhr von Real_PsychoDAD editiert. ]



  • Hast Du schon mal über API-Hooking nachgedacht? Du könntest dann z.B. die Aufrufe von CreateFile() abfangen. Damit bekommst Du doch eigentlich alle Infos, die Du benötigst.



  • Geht das bei der kernel32.dll?



  • ja hab ich, nur funktionierten meine Versuche nicht unter Win2000/XP.
    Und ich finde dazu auch sehr schwer Infos im Netz.
    Falls jemand Links/Resourcen dazu hat wäre ich sehr dankbar.



  • API Hooking Methods (Mathias Rauen)

    [ Dieser Beitrag wurde am 17.11.2002 um 13:45 Uhr von kwoTx editiert. ]



  • thx! 🙂



  • vielleicht hilft Dir
    FindFirstChangeNotification()
    ein Stück weiter. Ob geöffnet, kann man damit nicht feststellen, aber wenn in eine Datei geschrieben wurde, bekommt man über diese Funktion eine Nachricht.



  • moin

    ich habe hier mal ein kleines stück source für dich.

    Es wird bemerkt ob die datei geändert !!! wurde. dazu reicht es wenn in einem
    Editor "speichern" ausgelöst wird.

    statusdatei = m_statusverzeichnis + "atom.sts";

    DWORD dwWaitStatus;
    HANDLE dwChangeHandles;

    // Jetzt ueberwachen der statusdatei !!
    dwChangeHandles = FindFirstChangeNotification( m_statusverzeichnis, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE );

    if (dwChangeHandles == INVALID_HANDLE_VALUE)
    {
    ExitProcess (GetLastError());
    }

    while (erg == TRUE)
    {
    // Warten auf benachrictigung, das datei geändert wurde
    dwWaitStatus = WaitForSingleObject(dwChangeHandles, INFINITE);

    switch (dwWaitStatus)
    {
    case WAIT_OBJECT_0:
    // aktualisierte daten lesen und reagieren !!!!!!!

    datei = m_statusverzeichnis + "atom.sts";

    if( file.Open( _T ( datei ), CFile::modeReadWrite))
    {

    file.ReadString ( text);
    spielOffen = atoi(text.Left(1));
    file.Close();
    if (spielOffen == 0)
    {
    erg = FALSE;
    CDialog::OnOK(); // Dialog zu und gut
    }
    }
    else
    {
    AfxMessageBox("Datei Fehler !");
    // exit(-1);
    }

    // Überwachung auf Nächste Änderung einstellen
    if (FindNextChangeNotification( dwChangeHandles) == FALSE)
    ExitProcess(GetLastError());
    }

    }



  • Soweit war ich auch schon, es ging aber mehr um die Erfassung von Projektarbeitszeiten, wo mir das wenig half. Aber trotzdem danke.

    PS: Bei z.B. einem Worddokument klappt es mit OpenFile(...,OF_SHARE_EXCLUSIVE),
    aber bei anderen wie z.B. Notepad eben nicht, aber der Grund dafür wurde ja bereits gefunden.


Anmelden zum Antworten