Announcement

Collapse
No announcement yet.

Änderung von Dokumenten feststellen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Änderung von Dokumenten feststellen?

    Hallo!

    In meiner SQL DB sind in einer Tabelle Dateien (im Binärformat) hinterlegt. Dies können beliebige Dateiformate sein, wie z.B. Word, Excel, PDF usw.)
    In meiner kleinen Anwendung sollen die Dateien von dem SQL Server heruntergeladen werden und geöffnet werden. Soweit so gut, das klappt auch.

    ABER: Wenn der Anwender das Dokument (z.B. die Word-Datei) in Word ändert, soll die geänderte Datei auch wieder auf den Server hochgeladen werden. Wie stelle ich in meienr Anwednung am besten fest, dass die Datei geändert wurde, um sie dann wieder in der DB zu speichern?

    Ist der Ansatz so sinnvoll? Oder bin ich auf dem Holzweg?

    Vielen Dank

  • #2
    Das wird bei irgendwelchen MS-Formaten vielleicht noch gehen, aber bei beliebigen Dateiformaten nicht mehr
    Zum anzeigen der Datei musst du diese ja irgendwo ablegen und dann dort mit dem verknüpften Programm öffnen. Was gehen sollte, ist auf das Beenden des vernüpften Programmes zu warten.
    Ggf. kannst du dann
    - die Größe der Datei / Dateidatum(Uhrzeit) vorher und nacher vergleichen und dann über eine Speicherung entschreiden
    - immer eine erneute Speicherung vornehmen
    - es dem Anwender überlassen und einen entsprechenden Button anbieten
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Das wird bei irgendwelchen MS-Formaten vielleicht noch gehen, aber bei beliebigen Dateiformaten nicht mehr
      Zum anzeigen der Datei musst du diese ja irgendwo ablegen und dann dort mit dem verknüpften Programm öffnen. Was gehen sollte, ist auf das Beenden des vernüpften Programmes zu warten.
      Ggf. kannst du dann
      - die Größe der Datei / Dateidatum(Uhrzeit) vorher und nacher vergleichen und dann über eine Speicherung entschreiden
      - immer eine erneute Speicherung vornehmen
      - es dem Anwender überlassen und einen entsprechenden Button anbieten
      Vielen Dank!

      Ja, so hab ich mir das auch gedacht. Ich speichere die Datei in ein bestimmtes Verzeichnis. Auch an den Abgleich über die letzte Änderung der Datei habe ich schon gedacht.

      Aber wie warte ich auf das Beenden des verknüpften Programms?

      Comment


      • #4
        Du kannst eigentlich nur testen ob das File noch in Benutzung ist. Dazu einfach mal versuchen die Datei zu öffnen zum Beispiel per
        Code:
        File.Open(MeinLieberFilePath, FileMode.Open, FileAccess.Read, FileShare.None);
        wenn das geht weißt du zumindest das keine andere Anwendung ein Handle auf die Datei hat. Ein Editor der die Datei nicht sperrt die er gerade editiert wirst du aber so nicht bemerken. Wüsste auch nicht wie man das ohne konkretes Wissen über den speziellen Editor raus bekommen sollte.
        Achja nach dem obigen Test per File.Open nicht vergessen den eventuell geöffneten Stream auch wieder zu schließen wenn du ihn eigentlich nicht brauchst.
        Zuletzt editiert von Ralf Jansen; 18.04.2012, 16:46.

        Comment


        • #5
          WinApi CreateProcess und WaitForSingleObject
          Dafuer sollte es was in NET geben

          EDIT
          Damit dein Programm -solange es auf das Ende des Prozesses wartet - nicht "stehenbleibt" ist wohl das
          - auslesen aus der DB
          - das starten des externen Programmes
          - das warten auf das Ende des Prozesses
          - das schreiben in die DB
          in einen eigenen Thread auszuöagern.
          Zuletzt editiert von Christian Marquardt; 18.04.2012, 17:02.
          Christian

          Comment


          • #6
            Es gibt die Process Klasse in .NET die den Exited Event (in einem anderen Thread) feuert wenn der von ihr gestartete Process sich beendet.

            Ich vermute mal das SQL-Rookie zwar bereits die Process Klasse verwendet aber nur um die Datei darin ~auszuführen~ um die registrierte Standardanwendung indirekt zu öffnen. Dann zieht das obige Methode nicht weil wir gar nicht wissen welcher Prozess sich letztlich die Datei geschnappt hat.

            Comment


            • #7
              M.E. spiegelt dann Process den Prozess wieder, der die Datei ausführt.

              http://msdn.microsoft.com/de-de/library/fb4aw7b8.aspx

              Die gesamten Eigenschaften machen nur Sinn, wenn das auch der ausführende Prozess ist
              Zuletzt editiert von Christian Marquardt; 18.04.2012, 19:47.
              Christian

              Comment


              • #8
                Kann das gerade nicht aus der Hilfe herauslesen. Ein kurzer Test zeigt aber das du Recht hast. Der Event wird gefeuert wenn ich Notepad schließe.

                [Highlight=C#]
                class Program
                {
                static void Main(string[] args)
                {
                Process p = Process.Start("Blub.txt");
                p.EnableRaisingEvents = true;
                p.Exited += Exited;

                Console.Readline();
                }

                static void Exited(object sender, EventArgs e)
                {
                Console.WriteLine("Process Exited");
                }
                }[/Highlight]

                Comment


                • #9
                  Code:
                          public bool iview_convert(string option, string fname_Quelle, string fname_Ziel)
                          {
                              File.Delete(fname_Ziel);
                              string load = "\"" + fname_Quelle + "\"";
                              string save = " /convert=\"" + fname_Ziel + "\"";
                              string exit = " /cmdexit";
                              string param = load + option + save + exit;
                              System.Diagnostics.Process P = System.Diagnostics.Process.Start(iviewexe, param);
                              // string iviewexe ist eine globale Variable die den Pfad zu IrfanView angibt
                              P.WaitForExit();
                              for (int i = 0; i < 100; i++)
                              {
                                  if (File.Exists(fname_Ziel)) return true;
                                  Thread.Sleep(10);
                              }
                              return false;
                          }
                  Mit diesem Code starte ich IrfanView, um eine Raw-Datei in eine Jpg-Datei zu konvertieren. Mit WaitForExit warte ich bis der Prozess beendet wird, und dann muss ich noch etwas warten bis Windows die Datei auf Platte gespeichert hat.
                  Günther

                  Comment


                  • #10
                    Öhm... ein hash über den Inhalt des Files dürfte doch auch gehen, oder nicht? Damit könnte man feststellen ob sich das Dokument verändert hat. Hilft allerdings nichts wenn in dem Dokument z.B. letztes Öffnungsdatum festgehalten wird, denn das wird ja jedesmal geändert.

                    Comment


                    • #11
                      Öhm... ein hash über den Inhalt des Files dürfte doch auch gehen, oder nicht?
                      Vielleicht schon beim speichern IN die DB und abspeichern des Hashes die DB, so ist man dann bei der "Herausgabe" aus der DB nciht unter Zeitdruck.
                      Christian

                      Comment


                      • #12
                        Jo klar wenn ich das File ablege schaue ich ob sich der Hash geändert hat und wenn ja dann lege ich eine neue Version oder so ab.
                        Wir haben das auch für unsere Javascripts in der Webseite und machen so eine Art mini versionierung damit.

                        Comment

                        Working...
                        X