File.Open -> FileStream wird nicht ungültig



  • Hi,
    folgendes ist mir aufgefallen vielleicht weiß jemand warum das so ist:
    ich öffne eine Datei mit

    mStream = File.Open(filename,FileMode.Open,FileAccess.Read,FileShare.Delete | FileShare.ReadWrite);
    

    Im Anschluss halte ich das Programm an in dem ich eine Meldung ausgebe,
    die mit Ok bestätigt werden muss.
    Wenn das Meldungsfenster kommt lösche ich im Explorer die geöffnete Datei!
    Sprich der FileStream müsste eigentlich ungültig werden.
    Wenn ich nun aber mit den FileStream arbeite passiert kein Fehler ich kann die Datei sogar an andere stellen kopieren, obwohl sie gar nicht mehr da ist. Wie kann das sein?
    Ich kann nach dem löschen z.b. folgendes tun:

    FileStream tFS = File.Create("neuesFile.txt");
    
              do
              {
                tReadBytes = mStream.Read(buffer, 0, buffer.Length);
                if (tReadBytes > 0)
                  tFS.Write(buffer, 0, tReadBytes);
              }
              while (tReadBytes > 0);
              tFS.Close();
    

    ohne eine Exception zu bekommen viel mehr noch, die neue Datei ist sogar da, mit Inhalt der alten Datei. Mir ist klar das ich beim öffnen der Datei explizit das Löschen erlaubt habe aber ich hätte gedacht, dass der FileStream dann nicht mehr funktioniert.
    Finde das sehr komisch.. 😮
    hat einer eine Erklärung ?
    danke Grüße



  • FileHandler

    Wenn schon, dann File Handle (ohne R), ABER auch das würde ich hier nicht so nennen. Es ist einfach eine Abstraktion Namens FileStream.


  • Administrator

    Ich kann mir verschiedene Erklärungen vorstellen, aber schlussendlich wären es alles nur Mutmassungen. Dies hat allerdings nichts direkt mit .Net zu tun, sondern liegt wohl an Windows selbst. Man kann dasselbe Verhalten mit der WinAPI generieren:

    #include <windows.h>
    
    HANDLE open_file(wchar_t const* path, bool do_create)
    {
      return CreateFileW(
        path,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        nullptr,
        do_create ? CREATE_ALWAYS : OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        nullptr);
    }
    
    int main()
    {
      HANDLE read_file = open_file(L"C:\\temp\\read.txt", false);
    
      MessageBoxW(nullptr, L"Press OK!", L"Waiting...", MB_OK);
    
      HANDLE write_file = open_file(L"C:\\temp\\write.txt", true);
    
      DWORD read = 0;
      DWORD written = 0;
      char buffer[4096];
    
      while(ReadFile(read_file, buffer, 4096, &read, nullptr) && read)
      {
        WriteFile(write_file, buffer, read, &written, nullptr);
      }
    
      CloseHandle(read_file);
      CloseHandle(write_file);
    
      return 0;
    }
    

    Ich verschiebe dich daher mal in die WinAPI, da ich denke, dass man dir dort eher eine befriedigende Antwort geben kann. Dort hat es eher Leute, welche sich mit den Grundzügen von Windows auskennen.

    Grüssli



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Guck mal in den Papierkorb, bzw. versuch die Datei mal mit Shift+Del zu löschen.



  • Morgen 🙂
    Also es klappt trotzdem noch auch wenn die Datei nicht in den Papierkorb verschoben wird.
    Wahrscheinlich suche ich wieder Fehler die gar keine sind 😉 eigentlich wollte
    ich diesen Fall ja abfangen, da bei mir im Programm es vorkommen kann, dass die eine Liste von FileStream habe, die quasi veraltet ist,weil ein anderes Programm die Datei löscht. Aber anscheinend braucht das nicht abgefangen werden, da ja Windows anscheinend prima klar kommt.
    einziges Problem ist halt, dass ich dann mit der alten Datei arbeite
    grüße


Anmelden zum Antworten